一个写日志文件流被重定向的奇怪问题

2019-08-15 17:10:29 +08:00
 Buffer2Disk
现在是有 3 个程序

1.golang 的程序,内部文件流写日志到 /var/log/a.log

filePath = "/var/log/a.log"

wrt = io.MultiWriter(openFile(filePath))

func openFile(filePath string) io.Writer {
f, e := os.OpenFile(filePath, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
if e != nil {
log.Fatalf("error opening file: %v", e)
}
return f
}


2.
golang 的程序通过 supervisor 来管理的,supervisor 配置如下
把标准输出流也重定向写入到 a.log 这个文件里面去
stdout_logfile=/var/log/a.log
stderr_logfile=/var/log/a.log


3.
每天零点的时候有个 shell 脚本会去定时切割一下日志,写在 crond 里面的
cp /var/log/a.log /var/log/2019-08-15-a.log
echo "" >/var/log/a.log



现在的问题是,在某一天,发现 /var/log 路径下的日志变成了 2 个文件
/var/log/a.log /var/log/a.log.1

然后 golang 的程序输出日志也全部到 a.log.1 这个文件里面去了
a.log 文件里面变成了空了,shell 脚本切割出来的日志也是空的,

这个情况并不是每天都会发生,是某一天会偶然发生,这是为啥呢?
1066 次点击
所在节点    程序员
4 条回复
shangsharon
2019-08-16 00:53:55 +08:00
supervisor 会自动切割日志的,你可以试试让程序输出大量的日志,达到 super..的设置量了就会切割的
Buffer2Disk
2019-08-16 11:32:51 +08:00
@shangsharon 卧槽,还真有这个可能,谢谢大佬
Buffer2Disk
2019-08-16 13:17:32 +08:00
@shangsharon 查出来了,确实是这个问题,谢谢大佬
Buffer2Disk
2019-08-16 13:18:38 +08:00
设置如下就可以让 supervisor 禁止自动切割备份日志了
# no limit on the size
stdout_logfile_maxbytes=0
stderr_logfile_maxbytes=0

# no backup with supervisor
stdout_logfile_backups=0
stderr_logfile_backups=0

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/592192

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX