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

时间:2017-05-22 04:58:39

标签: logging go systemd

使用默认日志,但发现了两个问题,即使用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)

}

我在哪里错过了?

2 个答案:

答案 0 :(得分:1)

systemd的建议是登录STDOUT,systemd自动在日记中捕获并存储,journalctl -u yourproject.service可访问。它还为您处理日志轮换。

有关详细信息,您可以查看man journalctlman journald.conf

答案 1 :(得分:0)

<强>伐木 在不知道property.AppProperties.Logging.PathlogFile的值的情况下,很难知道这里有什么问题。此外,您将打开文件为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