golang如何将logrus错误自动写入受监管的stderr_logfile

问题描述

我正在使用超级用户来运行我的golang应用。我的主管会议看起来像

[program:go_web]
command=go-web-app
autostart=true
autorestart=true
startsecs=3
stdout_logfile=/var/log/app.log
stderr_logfile=/var/log/app_error.log

我的logrus设置如下:

package main

import (
    "github.com/sirupsen/logrus"
    log "github.com/sirupsen/logrus"
)

func main() {
    log.SetFormatter(&logrus.textformatter{
        ForceColors: true,})
    log.Info("this is an info")
    log.Error("this is an error")
}

但是我发现两个日志都记录在错误日志/var/log/app_error.log

INFO[0000] this is an info
ERRO[0000] this is an error

如何自动将信息记录到应用日志/var/log/app.log,将错误记录到错误日志var/log/app_error.log

谢谢

解决方法

  • 您可以创建实现struct接口的Writer,并将条件逻辑放在此处,即根据日志级别将日志写入的位置。
type OutputSplitter struct{}

func (splitter *OutputSplitter) Write(p []byte) (n int,err error) {
    // your logs filter logic here. For ex:
    if bytes.Contains(p,[]byte("level=error")) {
        return os.Stderr.Write(p)
    }
    return os.Stdout.Write(p)
}

然后使用该结构按日志记录日志。

logrus.SetOutput(&OutputSplitter{})
,

我找到了此问题的钩子实现:https://github.com/sirupsen/logrus/tree/master/hooks/writer

package main

import (
    "io/ioutil"
    "os"

    log "github.com/sirupsen/logrus"
    "github.com/sirupsen/logrus/hooks/writer"
)

func main() {
    log.SetOutput(ioutil.Discard) // Send all logs to nowhere by default

    log.AddHook(&writer.Hook{ // Send logs with level higher than warning to stderr
        Writer: os.Stderr,LogLevels: []log.Level{
            log.PanicLevel,log.FatalLevel,log.ErrorLevel,log.WarnLevel,},})
    log.AddHook(&writer.Hook{ // Send info and debug logs to stdout
        Writer: os.Stdout,LogLevels: []log.Level{
            log.InfoLevel,log.DebugLevel,})
    log.Info("This will go to stdout") 
    log.Warn("This will go to stderr")
}