【问题标题】:logging to syslog file with Zerolog (GoLang)使用 Zerolog (GoLang) 记录到 syslog 文件
【发布时间】:2022-11-23 09:52:30
【问题描述】:

我刚开始用 GoLang 编写我的第一个项目。我想将日志发送到 syslog(/var/log/syslog) 文件。

我在用零日志(github.com/rs/zerolog) 包来写日志。 这是我目前的记录方式:

log.Error().Str("Event_name", Event_name).Msg("Invalid event")

它正在将日志打印到终端而不是系统日志文件。有人可以举例或解释如何做到这一点吗?提前致谢。

【问题讨论】:

    标签: go logging


    【解决方案1】:

    使用下面的代码,我能够使用 zerolog 在本地和远程使用和不使用 TLS 将条目发送到 syslog。

    我之前提到过我无法让级别按预期工作,所有远程日志在我的 Synology NAS 日志中心显示为 KERN 级别日志。,原来我正在查看 Category 列,因为 Level 列已折叠。级别按预期工作。

    标准库 syslog 包不提供 TLS 支持,因此使用 RackSec 现在存档的 srslog。

    package main
    
    import (
        "log/syslog"
    
        "github.com/RackSec/srslog"
        "github.com/rs/zerolog"
    )
    
    func main() {
        // remote syslog over unencrypted tcp
        var zsyslog zerolog.SyslogWriter
        zsyslog, err := syslog.Dial("tcp", "192.168.0.44:514", syslog.LOG_KERN|syslog.LOG_EMERG|syslog.LOG_ERR|syslog.LOG_INFO|syslog.LOG_CRIT|syslog.LOG_WARNING|syslog.LOG_NOTICE|syslog.LOG_DEBUG, "stackOverflow")
        if err != nil {
            panic(err)
        }
        zsyslog.Debug("Debug message 1")
    
        zog := zerolog.New(zsyslog).With().Caller().Logger()
        zog.Debug().Msg("Debug message 2")
    
        //local syslog of unix sockets
        zsyslog2, err := syslog.New(syslog.LOG_KERN|syslog.LOG_EMERG|syslog.LOG_ERR|syslog.LOG_INFO|syslog.LOG_CRIT|syslog.LOG_WARNING|syslog.LOG_NOTICE|syslog.LOG_DEBUG, "stackOverflow")
        if err != nil {
            panic(err)
        }
        zsyslog2.Debug("Debug message 3")
    
        zog2 := zerolog.New(zsyslog2).With().Caller().Logger()
        zog2.Debug().Msg("Debug message 4")
    
        // remote syslog over tcp+tls (encrypted)
        useTLS := false
        if useTLS {
            certPath := "/path/to/cert.pem"
            zsyslog3, err := srslog.DialWithTLSCertPath("tcp+tls", "192.168.0.44:514", srslog.LOG_KERN|srslog.LOG_EMERG|srslog.LOG_ERR|srslog.LOG_INFO|srslog.LOG_CRIT|srslog.LOG_WARNING|srslog.LOG_NOTICE|srslog.LOG_DEBUG, "stackOverflow", certPath)
            if err != nil {
                panic(err)
            }
            zsyslog3.Debug("Debug message 5")
    
            zog3 := zerolog.New(zsyslog3).With().Caller().Logger()
            zog3.Debug().Msg("Debug message 6")
        }
    }
    
    

    【讨论】:

      【解决方案2】:

      您应该打开文件 /var/log/syslog,然后将记录器的输出设置为该文件:

      output, err := os.OpenFile("/var/log/syslog", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0666)
      if err != nil {
          // unhandled error
      }
      
      log.Error().Str("Event_name", Event_name).Msg("Invalid event")
      
      log.Output(output)
      

      顺便说一句,在读/写系统文件时,你必须有 sudo 权限。这意味着您的可执行文件必须在 sudo 下运行

      【讨论】:

      • 打开一个文件并写入该文件会不会对性能效率太低?我看到一些 syslog hooks 可以有效地做到这一点(就像在默认的 go logger 中一样)。
      • 那为什么不使用 log/syslog 包呢?: logger, err := syslog.NewLogger(syslog.LOG_INFO, 0)
      • log/syslog 不提供级别日志记录,对吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多