问题描述
我正在使用超级用户来运行我的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{})
- 这将根据日志级别过滤日志。错误将进入
/var/log/app_error.log
,其他错误将进入/var/log/app.log
- 原始来源:https://github.com/sirupsen/logrus/issues/403#issuecomment-346437512
我找到了此问题的钩子实现: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")
}