Logging 使用systemd在golang中旋转日志文件

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”):旋

正在使用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")
还修改了现有库并将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查看日志