【发布时间】:2017-10-21 15:25:41
【问题描述】:
使用 go 中的默认日志,但发现两个问题,即日志轮换和使用 systemd 运行程序时未打印日志。 所以我尝试使用如下库:
https://github.com/alecthomas/log4go
https://github.com/natefinch/lumberjack
log4go
似乎是一个完美的日志库,因为它提供了最大尺寸和旋转线。然而,当将 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 配置之外别无他法。运行良好,因为日志文件没有比参数指定的更大,但是没有创建新文件的迹象。配置
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)
}
我错过了什么?
【问题讨论】:
-
Systemd 日志记录是关于捕获标准输出。 Systemd 使用 journald 处理日志轮换。为了在 systemd 日志中获取日志内容,只需在 stdout 上写入信息,然后使用
journalctl -u myservice查看日志