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")
如果您想根据日志级别路由此否,那么您的建议可能有效,但感觉很奇怪并且可能存在竞争条件。
我建议你创建自己的钩子,获取钩子列表并根据消息或调用Info
、Warn
等时传递的字段路由到正确的钩子。
【讨论】:
以上是关于Logrus 根据需要与 syslog 挂钩的主要内容,如果未能解决你的问题,请参考以下文章