golang这种常驻进程的应用,日志文件是怎样写入的文件句柄是一直打开的吗还是写的时候打开

根据 12-factor 的建议,一个现代的网络服务应用是不应该写日志文件的。只有在做一些本机的应用才需要写日志文件。
在写日志文件的时候,当然是一直打开 Handler 的,golang 的 init 要慎用,一般只做一些全局的无状态的初始化。 这种需要关闭的,你需要在 main 的一开始 open 一个,然后紧接着 defer close 就好。然后再初始化 Logger 。
【golang这种常驻进程的应用,日志文件是怎样写入的文件句柄是一直打开的吗还是写的时候打开】 你提到的不能删除的问题,是因为你在windows上打开了就不能删除,在linux上文件不锁你随便删除,它会重新建的。
谢谢评论里的同学指正,如果用 logrus 输出到 io.Writer ,那么在 unix 系统中如果文件被删除,是不会被重建的,也不会有任何报错。想要达到 nginx 那样自己重建日志文件的效果,还是挺麻烦的。

■网友
一般来说都是写的时候打开写完就关,除非你文件记录非常频繁,那这样的话可以一直打开。
也可以稍微做下优化,比如积累几条写一次,或者比如说打开一次之后先不关,等一会没有继续写入的再关。

■网友
日志文件是一直打开,多线程通过队列写入,一般是行缓冲,程序停止会自动关闭句柄。nginx也是这么做的,大部分的应用程序都是这么做的,频繁的打开文件句柄会耗费额外的性能,得不偿失。
一般情况下,有成熟的日志处理框架来处理这些事情,不需要你自己实现。
你提到如果一直打开,你不能通过别的方式修改以及删除这个文件,这个是肯定的。当然这也延伸出另外一个问题,就是你一个程序如果启动多次,那在多个进程同时读写一个日志文件时日志内容有问题。

■网友
虽然不是写代码的,但是,我们是使用docker或者systemd来处理日志的


    推荐阅读