Logging 使用systemd在golang中旋转日志文件
正在使用go的默认日志,但发现两个问题,即日志旋转和使用systemd运行程序时未打印日志。 因此,我尝试使用以下库:Logging 使用systemd在golang中旋转日志文件,logging,go,systemd,Logging,Go,Systemd,正在使用go的默认日志,但发现两个问题,即日志旋转和使用systemd运行程序时未打印日志。 因此,我尝试使用以下库: https://github.com/alecthomas/log4go https://github.com/natefinch/lumberjack log4go 似乎是一个完美的日志库,因为它提供了旋转的最大大小和线条。但是,当设置rotate为true时,它确实创建了新的日志文件,但出现错误,应用程序终止 FileLogWriter(“logs/app.log”):旋
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")
还修改了现有库并将daily设置为true,以便在旋转时在文件上显示日期
伐木工人 接下来我尝试了这个图书馆。我很高兴找到,因为除了添加结构日志配置之外,没有什么可做的。工作正常,因为日志文件没有变大到参数指定的大小,但没有创建新文件的迹象。配置
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)
}
我在哪里失踪了?伐木工人 如果不知道
property.AppProperties.Logging.Path
和logFile
的值,就很难知道这里出了什么问题。此外,您正在以WRONLY(只写)和RDWR(读写)的形式打开文件
尝试os.OpenFile(logFile,os.O_WRONLY | os.O_CREATE | os.O_APPEND,0666)
log4go似乎未维护。但这可能就是错误的来源:
也许你的应用程序中还有另一个日志实现,可能仍然在使用该文件filelog.go
似乎在尝试重命名之前关闭了文件
<强>十二因子> < /强>。
12因素应用程序从不关心路由或存储数据 它的输出流并将日志的循环转移到另一个从stdout读取的进程,例如systemd、docker、logstash使用
systemd
的建议是登录到stdout,stdout由systemd
自动捕获并存储在日志中,可通过journalctl-u yourproject.service
访问。它还为您处理日志旋转
有关更多信息,您可以查看
manjournalctl
或manjournald.conf
Systemd日志记录是关于捕获标准输出的。Systemd使用日志处理日志旋转。为了在systemd journal中获取日志信息,只需在stdout上写入信息,然后使用journalctl-u myservice查看日志