【问题标题】:Does Log4Net have something comparable to Log4J's Markers?Log4Net 有与 Log4J 的 Markers 相媲美的东西吗?
【发布时间】:2014-12-10 19:34:49
【问题描述】:

log4net 有与log4j's Markers 相媲美的东西吗?

标记是用于向日志消息添加易于过滤的信息的对象。

我查看了log4net API,但 ILog 接口没有任何方法可以接受任何可以解释为标记类型的东西的额外标记。

例如,我只想记录到单个记录器:

ILog logger = LogManager.GetLogger(typeof(MyClass));
logger.Error("This is an error!");

但是,有时我希望将这些错误放在 EventLog 中。

目前,我创建了第二个记录器,并引用了 EventLogAppender。它也继承了根记录器的所有附加程序。

这意味着我需要在要记录的类中有 2 个记录器引用。 1 用于记录到事件日志,1 用于我不想进入事件日志的日志:

ILog logger = LogManager.GetLogger(typeof(MyClass)); //root logger
ILog eventLogger = LogManager.GetLogger("EventLogger"); //eventlog logger
logger.Info("Some message that doesn't need to go to the event log.");
eventLogger.Error("Some error that does need to go to the event log.");

有了标记,我可以做类似的事情

logger.Info(EVENT_LOG_MARKER, "This message should go to the event log.");

然后过滤器会拾取标记,并激活适当的附加程序。

我可以在消息的开头附加一个魔术字符串,然后使用过滤器将其挑选出来,但这充其量看起来是很骇人听闻的。

没有使用魔术字符串,log4net 中是否还有其他选项可以实现 Marker 类型系统?

【问题讨论】:

    标签: .net log4net


    【解决方案1】:

    log4net 的ILog 接口中没有标记,但您可以使用property filters 将您的事件路由到正确的记录器:只需在您的代码中创建一个记录器并将所有事件发送到此记录器。在您的根配置中设置您想要的两个附加程序

    root
        event log appender
        file appender
    

    然后在每个附加程序中过滤掉具有或不具有正确属性值的消息,例如

    <!-- filter in the event log appender -->
    <filter type="log4net.Filter.Property">
        <key value="ToEventLog" />
        <stringToMatch value="true" />
    </filter>
    <filter type="log4net.Filter.DenyAllFilter" />
    

    尽管它是移植到属性而不是消息的魔术字符串,并且您需要将日志记录在一些设置属性的代码中:使用 IDisposable 来包装属性的设置和拆卸可能是一个好主意,例如:

    log.Info("To wherever!!");
    using (var SendToEventLogSwitch = new EventLogSwitch)
    {
        log.Info("To EventLog!!");
    }
    

    您还可以在 ILog 上使用扩展方法来添加标记并在后台使用属性机制。

    public static void EventLog(this ILog log, string message)
    {
        log4net.ThreadContext.Properties["ToEventLog"] = "true";
        log.Info(message);
        log4net.ThreadContext.Properties["ToEventLog"] = "false";
    }
    

    【讨论】:

    • 通过扩展方法,我可以为接口创建一个伪标记扩展。这是个好主意!感谢您的建议。
    猜你喜欢
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 2010-09-24
    • 2012-07-16
    • 1970-01-01
    相关资源
    最近更新 更多