使用& # 39;环境# 39;log4net配置中的值

本文关键字:配置 环境 使用 log4net | 更新日期: 2023-09-27 18:15:45

我的应用程序可以作为Windows服务控制台环境启动。对于每种情况,我都需要一些log4net appender处于活动状态(或不处于活动状态),以及一些在两种情况下都处于活动状态的appender。服务(: RollingFileAppender, DebugAppender(如果启用了), EventLogAppender | 控制台: ColoredConsoleAppender, DebugAppender(如果启用了))

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

<filter type="log4net.Filter.PropertyFilter">
    <key value="ApplicationMode" />
    <stringToMatch value="Service" />
</filter>
if(!Environment.UserInteractive)
    ThreadContext.Properties["ApplicationMode"] = "Service";

然而,由于该属性是在线程上下文中声明的,因此它只对当前线程有效。如果线程改变,配置将被重置,我必须再次声明它。

log4net是否支持在配置中声明PropertyFilter以自动设置所需环境的方法?这样的:

<filter type="log4net.Filter.PropertyFilter">
    <key value="{Environment.UserInteractive}" />
    <stringToMatch value="false" />
</filter>

还是……有没有更好的方法?因为我还没有找到解决办法。这种做法不常见吗?

使用& # 39;环境# 39;log4net配置中的值

请看我对这个问题的最后部分回答:

使用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";

我不确定,但我认为你可以按照你在帖子中描述的那样配置你的过滤器。