golang如何将logrus错误自动写入SupervisordStderr_日志文件

golang如何将logrus错误自动写入SupervisordStderr_日志文件,go,supervisord,logrus,Go,Supervisord,Logrus,我正在使用supervisord运行我的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/

我正在使用supervisord运行我的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\u error.log

INFO[0000] this is an info
ERRO[0000] this is an error
如何自动将信息记录到我的应用程序日志
/var/log/app.log
,并将错误记录到错误日志
var/log/app\u error.log

谢谢

  • 您可以创建一个实现
    Writer
    接口的
    struct
    ,并将条件逻辑放在那里,即根据日志级别将日志写入的位置
类型OutputSplitter结构{}
func(拆分器*输出拆分器)写入(p[]字节)(n int,err error){
//您的日志在此处筛选逻辑。例如:
if bytes.Contains(p,[]字节(“级别=错误”)){
返回os.Stderr.Write(p)
}
返回os.Stdout.Write(p)
}
然后使用该结构通过logrus写入日志

logrus.SetOutput(&OutputSplitter{})
  • 这将根据日志级别筛选日志。错误将转到
    /var/log/app\u error.log
    ,其他错误将转到
    /var/log/app.log
  • 原始资料来源:

我找到了此问题的钩子实现:


为了实现这一点,虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接以供参考。如果链接页面发生更改,则仅链接的答案可能无效-
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")
}