Logrus 根据需要与 syslog 挂钩

Posted

技术标签:

【中文标题】Logrus 根据需要与 syslog 挂钩【英文标题】:Logrus hooks with syslog by demand 【发布时间】:2020-10-28 16:18:37 【问题描述】:

我正在使用 golang logrus 进行日志记录,并且我有一个包含所有常规函数的包装器,例如 Info(..)Infof(..) 等我想实现一个包装器函数 Audit(..) 以记录到 syslog。 我注意到 logrus syslog hooks 的问题是,一旦它被钩住,每个日志函数都会记录到 syslog,还有 Infof(..) 我不希望他们这样做。

有没有一种方法可以按需调用 syslog?除了:

func (l *WrapLogger) Audit(msg string) 
       l.logger.AddHook(syslogHook)
       l.logger.Info(msg)
       l.logger.ReplaceHooks(logrus.LevelHooks) // removing somehow the hook

谢谢

【问题讨论】:

我不确定我是否理解您的问题。您创建了两个 WrapLogger 实例,如果您调用 wl1.info("hello") 它会在 syslog 中添加两次“hello”? 不完全是@boaz_shuster,我只有 1 个日志包装器。我的主要问题:有没有办法控制将调用哪些钩子?现在我正在考虑它,也许我应该包装 2 个 logrus 实例:一个带有 syslog 钩子,另一个没有。 【参考方案1】:

如果您尝试通过日志级别委派要发送的消息,则可以通过设置挂钩接受的日志级别来实现。

例如:

log.AddHook(&writer.Hook
    Writer: os.Stderr,
    LogLevels: []log.Level log.WarnLevel ,
)
log.AddHook(lSyslog.NewSyslogHook("udp", "localhost:514", syslog.LOG_INFO, ""))
log.Info("This will go to syslog")
log.Warn("This will go to stderr")

如果您想根据日志级别路由此否,那么您的建议可能有效,但感觉很奇怪并且可能存在竞争条件。

我建议你创建自己的钩子,获取钩子列表并根据消息或调用InfoWarn 等时传递的字段路由到正确的钩子。

【讨论】:

以上是关于Logrus 根据需要与 syslog 挂钩的主要内容,如果未能解决你的问题,请参考以下文章

logrus 剖析之 hook

使用 syslog 时禁用/启用日志记录

根据恒定条件调用反应挂钩是不是安全?

十syslog日志与loganalyzer日志管理

根据代码顺序,挂钩 sendto() 会导致崩溃

反应挂钩以根据先前的状态值更新状态[重复]