golang这种常驻进程的应用,日志文件是怎样写入的文件句柄是一直打开的吗还是写的时候打开
根据 12-factor 的建议,一个现代的网络服务应用是不应该写日志文件的。只有在做一些本机的应用才需要写日志文件。
在写日志文件的时候,当然是一直打开 Handler 的,golang 的 init 要慎用,一般只做一些全局的无状态的初始化。 这种需要关闭的,你需要在 main 的一开始 open 一个,然后紧接着 defer close 就好。然后再初始化 Logger 。
【golang这种常驻进程的应用,日志文件是怎样写入的文件句柄是一直打开的吗还是写的时候打开】 你提到的不能删除的问题,是因为你在windows上打开了就不能删除,在linux上文件不锁你随便删除,它会重新建的。
谢谢评论里的同学指正,如果用 logrus 输出到 io.Writer ,那么在 unix 系统中如果文件被删除,是不会被重建的,也不会有任何报错。想要达到 nginx 那样自己重建日志文件的效果,还是挺麻烦的。
■网友
一般来说都是写的时候打开写完就关,除非你文件记录非常频繁,那这样的话可以一直打开。
也可以稍微做下优化,比如积累几条写一次,或者比如说打开一次之后先不关,等一会没有继续写入的再关。
■网友
日志文件是一直打开,多线程通过队列写入,一般是行缓冲,程序停止会自动关闭句柄。nginx也是这么做的,大部分的应用程序都是这么做的,频繁的打开文件句柄会耗费额外的性能,得不偿失。
一般情况下,有成熟的日志处理框架来处理这些事情,不需要你自己实现。
你提到如果一直打开,你不能通过别的方式修改以及删除这个文件,这个是肯定的。当然这也延伸出另外一个问题,就是你一个程序如果启动多次,那在多个进程同时读写一个日志文件时日志内容有问题。
■网友
虽然不是写代码的,但是,我们是使用docker或者systemd来处理日志的
推荐阅读
- 家里这种床单可不要扔了,要比古董还值钱,难怪有钱人都收藏起来
- 『呼吸衰竭』这种病小心拖成呼吸衰竭! 天冷了别大意
- 坐标合肥,请问在哪里能捕捉到程序员这种生物他们大都出现在哪里呢
- 西安两男子从网上学会这种技术,竟专门用来......刑拘!
- 啥人会去买iPhone 8这种产品呢
- 「巧克力中富含黄烷醇,能够增强脑部活动能力;因此人均巧克力消费量越高的国家,按人口平均计算的诺贝尔奖得主人数就越多。」这种说法科学么
- 人类能证明除了自己,其他人也有意识吗(我有意识,其他人也一定有这种方式不算)
- 卫星云图中这种图像是啥情况
- 像知乎豌豆夹这种新兴互联网公司发展的实际状况咋样
- 织毛衣这种工艺是否会渐渐消失