使用默认日志,但发现了两个问题,即使用systemd运行程序时,日志轮换和日志未被打印。 所以我尝试使用库如下:
https://github.com/alecthomas/log4go
https://github.com/natefinch/lumberjack
log4go
似乎是一个完美的日志库,因为它提供了最大尺寸和旋转线。但是当set rotate为true时,它确实创建了新的日志文件,但是出现错误,然后应用程序终止。
FileLogWriter(" logs / app.log"):旋转:重命名logs / stream.log logs / app.log.2017-05-21.001:进程无法访问该文件 因为它正被另一个进程使用。
配置:
logger:=log4go.NewDefaultLogger(log4go.DEBUG)
logger.AddFilter("log", log4go.FINE, log4go.NewFileLogWriter("/log/app.log", true))
logger.Info("success")
还修改了现有的库并将每日设置为true,因此在旋转时它会在文件上显示日期
伐木
接下来我尝试了这个库。很高兴找到,因为除了添加struct log配置之外别无他法。工作得很好,因为日志文件没有超出param指定的范围,但是没有创建新文件的迹象。构造
var PrintLog *log.Logger
func main() {
_ = os.Mkdir(property.AppProperties.Logging.Path, os.ModePerm)
f, e := os.OpenFile(logFile, os.O_WRONLY|os.O_APPEND|os.O_CREATE|os.O_RDWR, 0666)
if e != nil {
fmt.Printf("error opening file: %v", e)
}
PrintLog = log.New(f, "", log.Ldate|log.Ltime)
l:= &lumberjack.Logger{
Filename: logFile,
MaxSize: 2, // megabytes
MaxBackups: 3,
MaxAge: 20, //days
}
log.SetOutput(l)
}
我在哪里错过了?
答案 0 :(得分:1)
systemd
的建议是登录STDOUT,systemd
自动在日记中捕获并存储,journalctl -u yourproject.service
可访问。它还为您处理日志轮换。
有关详细信息,您可以查看man journalctl
或man journald.conf
答案 1 :(得分:0)
<强>伐木强>
在不知道property.AppProperties.Logging.Path
和logFile
的值的情况下,很难知道这里有什么问题。此外,您将打开文件为WRONLY(只写)和RDWR(读写)。
尝试os.OpenFile(logFile, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)
log4go 似乎无法维护。但这可能是错误来自的地方: https://github.com/alecthomas/log4go/blob/master/filelog.go#L169
也许您的应用中仍然有另一个可能仍在使用该文件的日志记录实现? filelog.go
似乎在尝试重命名之前关闭了文件。
12种方式考虑这一点也可能有用。 https://12factor.net/logs
十二因素应用程序从不关心路由或存储 它的输出流。
将日志轮换卸载到另一个从stdout读取的进程,例如systemd,docker,logstash