Log4Net有与Log4J标记类似的东西吗?

时间:2014-12-10 19:34:50

标签: .net log4net

log4net是否具有与log4j's Markers相当的东西?

  

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

我已查看log4net API,但ILog界面没有任何方法可以接受任何可被解释为标记类型的额外令牌。

例如,我只想登录一个记录器:

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

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

目前我创建了第二个记录器,其中引用了EventLogAppender。它也继承了根记录器中的所有appender。

这意味着我需要在将要记录的类中使用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.");

然后过滤器会拾取标记,并激活相应的appender。

我可以在消息的开头添加一个魔术字符串,并使用过滤器选择它,但这看起来似乎是最好的。

如果没有使用魔术字符串,log4net中是否有另一个用于实现Marker类型系统的选项?

1 个答案:

答案 0 :(得分:3)

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

root
    event log appender
    file appender

然后在每个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";
}