首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ThreadContext属性不写入AdoNetAppender

ThreadContext属性不写入AdoNetAppender
EN

Stack Overflow用户
提问于 2009-03-05 21:36:11
回答 1查看 3.1K关注 0票数 0

我使用的是log4net 1.2.10.0。我对ILog和LogManager进行了扩展,增加了一个新的级别'AUDIT‘。我想使用AdoNetAppender%message记录到数据库中。我需要记录其他信息,并且我尝试使用log4net.ThreadContext.Properties

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

代码语言:javascript
复制
<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>

执行代码是(假设已经初始化了日志,并创建了一个日志记录器‘log4net’)。

代码语言:javascript
复制
log4net.ThreadContext.Properties["custom_prop"] = "value";
log.Audit("a message");

如果我硬编码一个值,而不是使用SQL参数,那么附加器将与审计过滤器一起工作。

代码语言:javascript
复制
...
<commandText value="INSERT INTO table1 VALUES('value', :message)" />
...

如果我在一个内置的级别上进行过滤,比如INFO,那么这个附加器就会使用context属性。

代码语言:javascript
复制
...
<filter type="log4net.Filter.LevelMatchFilter">
  <levelToMatch value="INFO" />
</filter>
...

FileAppender使用审计筛选器和上下文属性!

代码语言:javascript
复制
<appender name="FileAppender" type="log4net.Appender.FileAppender" >
  <filter type="log4net.Filter.LevelMatchFilter">
    <levelToMatch value="AUDIT" />
    </filter>
  <filter type="log4net.Filter.DenyAllFilter" />
  <file value="test.log" />
  <layout type="log4net.Layout.PatternLayout" >
    <conversionPattern value="%-5level [%property{custom_prop}] - %message%newline" />
  </layout>
</appender>

结果是

代码语言:javascript
复制
AUDIT [value] - a message

使用全局上下文属性可与AdoNetAppender和审计筛选器配合使用。但是,我需要线程上下文解析。

代码语言:javascript
复制
log4net.GlobalContext.Properties["custom_prop"] = "value";
log.Audit("a message");

结果是

代码语言:javascript
复制
table1
custom_prop message
=========== =======
value       a message

所以,我不知道这是AdoNetAppender的问题,还是我的扩展类的问题,还是我的配置问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-03-06 14:40:51

该问题是由提前中止前台线程引起的。我觉得log4net在做一个异步操作。在测试应用程序的末尾设置睡眠解决了这个问题

代码语言:javascript
复制
...
log4net.ThreadContext.Properties["custom_prop"] = "value";
log.Audit("a message");
...
Thread.Sleep(1000);

或者,当在单独的线程中时,连接到该线程上

代码语言:javascript
复制
Thread t = new Thread(new ThreadStart(delegate
{
    log4net.ThreadContext.Properties["custom_prop"] = "value";
    log.Audit("a message");        
}));
t.Start();
...
t.Join();

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/616729

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档