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类型系统的选项?
答案 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";
}