golang如何自动将logrus错误写入supervisord stderr_logfile

标签 go supervisord logrus

我正在使用 supervisord 来运行我的 golang 应用程序。我的supervisord conf看起来像

[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接口(interface),并将您的条件逻辑放在那里,即应根据日志级别将日志写入何处。

  • 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 写入日志。
    logrus.SetOutput(&OutputSplitter{})
    
  • 这会根据日志级别过滤日志。错误将转到 /var/log/app_error.log其他人会去/var/log/app.log
  • 原文来源:https://github.com/sirupsen/logrus/issues/403#issuecomment-346437512
  • 关于golang如何自动将logrus错误写入supervisord stderr_logfile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63661628/

    相关文章:

    go - 最小化 Go 中垃圾收集问题的最佳实践

    python - supervisor 和 uWSGI 不会与 nginx 一起工作

    Golang logrus - 如何进行集中配置?

    go - 处理程序服务后,如何从请求对象取回记录器对象?

    go - 如何跳过 Go 中文件的第一行?

    python - 在 Mac Os 中编译和链接 Python 模块

    go - undefined : fmt. Println(build) 在GOlang中是什么意思?使用 "fmt.Println(len("hello world")"

    python - 将域名连接到 django web 服务器

    docker - fig docker 监控损坏的容器

    go - 将 Elasticsearch 与 Logrus 集成(golang 日志记录)