golang如何将logrus错误自动写入SupervisordStderr_日志文件
我正在使用supervisord运行我的golang应用程序。我的上司看起来像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/
[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")
}