我的应用程序可以作为 Windows服务和控制台环境启动。对于每种情况,我需要一些log4net appender来激活(或不分别)以及一些在两种情况下都是活动的。 (服务:RollingFileAppender
,DebugAppender
(,如果已启用),EventLogAppender
| 控制台:{{ 1}},ColoredConsoleAppender
(如果已启用))
实现类似功能的唯一方法是将DebugAppender
与PropertyFilter
一起使用,如下所示:
ThreadContext.Properties
但是,由于该属性是在线程上下文中声明的,因此它仅适用于当前线程。如果线程发生变化,则重置配置,我必须再次声明它。
log4net是否支持在配置中声明<filter type="log4net.Filter.PropertyFilter">
<key value="ApplicationMode" />
<stringToMatch value="Service" />
</filter>
if(!Environment.UserInteractive)
ThreadContext.Properties["ApplicationMode"] = "Service";
以自动设置所需环境的方法?像这样:
PropertyFilter
或者......有更好的方法吗?既然我还没有找到解决方案..这是不常见的做法吗?
答案 0 :(得分:1)
请参阅我对这个问题的答案的最后部分:
总而言之,您可以实现一个包含上述逻辑的对象,并将该对象放在GlobalContext.Properties中。当log4net从Properties中检索值(您的对象)时,它将调用ToString来获取实际值。把你的逻辑放在ToString中。
也许是这样的:
public class ApplicationModeProvider
{
public override string ToString()
{
return Environment.UserInteractive ? "Console" : "Service";
}
}
在启动时将它放在你的字典中:
GlobalContext.Properties["ApplicationMode"] = new ApplicationModeProvider();
实际上,这有点像添加
if(!Environment.UserInteractive)
ThreadContext.Properties["ApplicationMode"] = "Service";
在记录声明之前。
我不确定,但我认为您可以按照自己在帖子中描述的方式配置过滤器。