Xml ThreadContext属性不写入AdoNetAppender

Xml ThreadContext属性不写入AdoNetAppender,xml,configuration,log4net,adonetappender,Xml,Configuration,Log4net,Adonetappender,我正在使用log4net1.2.10.0。我已经扩展了ILog和LogManager,加入了一个新的级别“审计”。我想使用AdonNetAppender将%消息记录到数据库中。我需要记录其他信息,并尝试使用log4net.ThreadContext.Properties 当我尝试使用上下文属性作为SQL参数的值时,没有得到任何输出 <log4net> <level> <name value="AUDIT" /> <value valu

我正在使用log4net1.2.10.0。我已经扩展了ILog和LogManager,加入了一个新的级别“审计”。我想使用AdonNetAppender将%消息记录到数据库中。我需要记录其他信息,并尝试使用log4net.ThreadContext.Properties

当我尝试使用上下文属性作为SQL参数的值时,没有得到任何输出

<log4net>
  <level>
    <name value="AUDIT" />
    <value value="35000" />
  </level>
  <appender name="AdoNetAppender.Audit" type="log4net.Appender.AdoNetAppender">
    <filter type="log4net.Filter.LevelMatchFilter">
      <levelToMatch value="AUDIT" />
    </filter>
    <filter type="log4net.Filter.DenyAllFilter" />
    <connectionType value="System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    <connectionString value="data source=db1;User ID=user;Password=pass" />
    <commandText value="INSERT INTO table1 VALUES(:custom_prop, :message)" />
    <parameter>
      <parameterName value=":custom_prop" />
      <dbType value="String" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%property{custom_prop}" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value=":message" />
      <dbType value="String" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%message" />
      </layout>
    </parameter>
  </appender>
  <root>
    <level value="ALL" />
    <appender-ref ref="AdoNetAppender.Audit" />
  </root>
</log4net>
...
<commandText value="INSERT INTO table1 VALUES('value', :message)" />
...
如果我硬编码一个值而不是使用SQL参数,那么appender将与审计过滤器一起工作

<log4net>
  <level>
    <name value="AUDIT" />
    <value value="35000" />
  </level>
  <appender name="AdoNetAppender.Audit" type="log4net.Appender.AdoNetAppender">
    <filter type="log4net.Filter.LevelMatchFilter">
      <levelToMatch value="AUDIT" />
    </filter>
    <filter type="log4net.Filter.DenyAllFilter" />
    <connectionType value="System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    <connectionString value="data source=db1;User ID=user;Password=pass" />
    <commandText value="INSERT INTO table1 VALUES(:custom_prop, :message)" />
    <parameter>
      <parameterName value=":custom_prop" />
      <dbType value="String" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%property{custom_prop}" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value=":message" />
      <dbType value="String" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%message" />
      </layout>
    </parameter>
  </appender>
  <root>
    <level value="ALL" />
    <appender-ref ref="AdoNetAppender.Audit" />
  </root>
</log4net>
...
<commandText value="INSERT INTO table1 VALUES('value', :message)" />
...
导致

AUDIT [value] - a message
table1
custom_prop message
=========== =======
value       a message
使用全局上下文属性可与AdonNetAppender和AUDIT筛选器配合使用。但是,我需要线程上下文解析

log4net.GlobalContext.Properties["custom_prop"] = "value";
log.Audit("a message");
导致

AUDIT [value] - a message
table1
custom_prop message
=========== =======
value       a message

因此,我不知道这是否是AdonNetAppender或我的扩展类或配置的问题。

该问题是由前台线程的早期中止引起的。我认为log4net正在运行一个异步操作。将睡眠放在测试应用程序的末尾修复了这个问题

...
log4net.ThreadContext.Properties["custom_prop"] = "value";
log.Audit("a message");
...
Thread.Sleep(1000);
或者,当在单独的螺纹中时,在其上连接

Thread t = new Thread(new ThreadStart(delegate
{
    log4net.ThreadContext.Properties["custom_prop"] = "value";
    log.Audit("a message");        
}));
t.Start();
...
t.Join();

在正常操作中,log4net在最新的审核调用和执行结束之间应该有足够的时间。

LogicalThreadContext似乎也适用于AdoNetAppender和审核级别。它刚刚开始使用ThreadContext属性,我不知道发生了什么。