【问题标题】:Conditional logging with log4net使用 log4net 进行条件日志记录
【发布时间】:2020-05-21 18:14:42
【问题描述】:

我有一个使用 log4Net 的程序,它同时使用 text 和 smtp appenders。

当程序运行时,smtp appender 会捕获多个日志记录,并在发送邮件之前缓冲等待程序结束。

当程序快完成时,我可能会发现我不需要发送电子邮件,实际上我会记录“无事可做”之类的内容。

我知道可以通过代码来操作 appenders 配置,因此我可以禁止将阈值设置为关闭的邮件。

我想知道是否可以仅使用 log4net 配置获得相同的结果:如果在任何时候记录了特定字符串,则 smtp 附加程序不应发送电子邮件。相反,如果没有记录该字符串,它应该正常运行并发送与定义的过滤器匹配的所有行。

【问题讨论】:

    标签: log4net-configuration


    【解决方案1】:

    TL;DR;

    • 创建自定义ITriggeringEventEvaluator
    • 使用此评估程序配置您的 smtp 附加程序:决定缓冲区已满时必须发生的事情(丢弃消息,发送它们)
    • 使用 appender 的自动刷新功能将日志事件向前发送

    log4net 中的BufferingAppenderSkeleton 中有两个属性可能会让您感兴趣。当您将此类 appender 配置为 Lossy 时,EvaluatorLossyEvaluator 用于确定是否应将消息发送到下一个 appender。

    Evaluator 属性允许您定义一个继承自 ITriggeringEventEvaluator 的类;当记录消息并且缓冲区已满时,将调用评估程序,如果它在 IsTriggeringEvent 方法上返回 true,则处理事件缓冲区。 LossyEvaluator 以相同的方式工作,除了调用它来决定是否必须记录由于缓冲区已满而将从缓冲区中消失的最旧事件。

    由于您的SmtpAppenderBufferingAppenderSkeleton,您可以使用Evaluator 属性来定义触发或不发送电子邮件的内容(即您说“无日志”或其他任何内容的日志事件)

    但是,如果您希望 appender 在其关闭时自行决定是否发送事件日志(即是否应该自动刷新),则使用 LossyEvaluator

    现在有个坏消息:在 log4net 中只有一个 ITriggeringEventEvaluator 实现实例,它根据日志事件的级别评估日志事件。因此,您必须编写自己的触发器才能识别应用程序发送到附加程序的特殊消息。

    【讨论】:

    • 好主意。但我看到它不能仅在配置上完成,我们必须开发 Log4Net 的扩展。也许在 List 中“记录”会更简单,并在程序结束时决定我是否可以丢弃日志或将 List 中的所有字符串发送到真正的 log 方法。
    • 是的,很多人决定不为此类问题编写一些 log4net 扩展,但在我看来,拖着一个字符串列表并在最后推送它有点代码味道:它是可能的,乍一看可能更容易,但我不是很喜欢。
    • 事实上,当你想到它时,缓冲区追加器一个隐藏在幕后的数据列表,所以我真的推荐使用它
    • 我也不喜欢它,但有时时间限制和对 log4net 的缺乏经验会导致塞住鼻子:-(
    • 反正我会在业余时间尝试。你是对的:已经有一个列表,所以最好使用它。
    猜你喜欢
    • 2016-06-05
    • 2013-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-27
    • 2011-08-09
    • 1970-01-01
    相关资源
    最近更新 更多