使用'环境' log4net配置中的值

时间:2014-07-31 14:26:21

标签: c# logging windows-services log4net app-config

我的应用程序可以作为 Windows服务控制台环境启动。对于每种情况,我需要一些log4net appender来激活(或不分别)以及一些在两种情况下都是活动的。 (服务RollingFileAppenderDebugAppender,如果已启用),EventLogAppender | 控制台:{{ 1}},ColoredConsoleAppender如果已启用))

实现类似功能的唯一方法是将DebugAppenderPropertyFilter一起使用,如下所示:

ThreadContext.Properties

但是,由于该属性是在线程上下文中声明的,因此它仅适用于当前线程。如果线程发生变化,则重置配置,我必须再次声明它。

log4net是否支持在配置中声明<filter type="log4net.Filter.PropertyFilter"> <key value="ApplicationMode" /> <stringToMatch value="Service" /> </filter> if(!Environment.UserInteractive) ThreadContext.Properties["ApplicationMode"] = "Service"; 以自动设置所需环境的方法?像这样:

PropertyFilter

或者......有更好的方法吗?既然我还没有找到解决方案..这是不常见的做法吗?

1 个答案:

答案 0 :(得分:1)

请参阅我对这个问题的答案的最后部分:

Capture username with log4net

总而言之,您可以实现一个包含上述逻辑的对象,并将该对象放在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";
在记录声明之前

我不确定,但我认为您可以按照自己在帖子中描述的方式配置过滤器。