我知道您谈到仅在代码中更改您的附加程序,但我真的认为您会通过使用根据代码中设置的上下文属性选择的附加程序来获得更多好处
一个例子是在你的配置文件中做这样的事情:
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender,log4net">
<filter type="log4net.Filter.PropertyFilter">
<key value="target" />
<stringToMatch value="DB" />
<acceptOnMatch value="true" />
</filter>
<filter type="log4net.Filter.DenyAllFilter" />
<!-- your ado configuration -->
<appender name="AnotherAppender" type="log4net.Appender.EventLogAppender,log4net">
<filter type="log4net.Filter.PropertyFilter">
<key value="target" />
<stringToMatch value="EventLog" />
<acceptOnMatch value="true" />
</filter>
<filter type="log4net.Filter.DenyAllFilter" />
<!-- your Eventlog configuration -->
然后在您的代码中,您可以将 loggertarget
属性设置为您想要的目标:
var isDB = true;
var loggingEvent = new LoggingEvent(typeof(Program), Log.Logger.Repository, Log.Logger.Name, Level.Info, "message", null);
loggingEvent.Properties["target"] = isDB ? "DB" : "EventLog";
Log.Logger.Log(loggingEvent);
这样,您的代码中就不会隐藏神奇的日志输出,输出是通过配置驱动的,因此您可以轻松更改它,并且路由是您在应用程序中唯一需要处理的事情。
如果您不需要每条消息的上下文(例如,您知道一旦记录路由更改,它不会再次切换很长时间),您可以使用可以全局设置的其他三个上下文之一:
log4net.GlobalContext
用于应用程序中的所有记录器
log4net.ThreadContext
在同一线程中的记录器之间共享
log4net.
ThreadLogicalContext 在线程的相同逻辑边界中的记录器之间共享(有关差异的更多信息)