我正在使用log4net 1.2.10.0 . 我已经扩展了ILog和LogManager以包含一个新级别'AUDIT' . 我想使用 AdoNetAppender
将 %message
记录到数据库中 . 我需要记录其他信息,我尝试使用 log4net.ThreadContext.Properties
.
当我尝试使用context属性作为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>
执行代码是(假设log4net已经初始化并且已经创建了 Logger 'log') .
log4net.ThreadContext.Properties["custom_prop"] = "value";
log.Audit("a message");
如果我硬编码值而不是使用SQL参数,则appender与AUDIT过滤器一起使用 .
...
<commandText value="INSERT INTO table1 VALUES('value', :message)" />
...
如果我在内置级别(如INFO)上进行过滤,则appender将使用context属性 .
...
<filter type="log4net.Filter.LevelMatchFilter">
<levelToMatch value="INFO" />
</filter>
...
FileAppender
与AUDIT过滤器和上下文属性一起使用!
<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>
导致
AUDIT [value] - a message
使用全局上下文属性可与 AdoNetAppender
和AUDIT过滤器一起使用 . 但是,我需要线程上下文解析 .
log4net.GlobalContext.Properties["custom_prop"] = "value";
log.Audit("a message");
导致
table1
custom_prop message
=========== =======
value a message
所以,我对 AdoNetAppender
或我的扩展类或我的配置都不了解't know if it' .
1 回答
问题是由前台线程的早期中止引起的 . 我认为log4net正在运行异步操作 . 在测试应用程序结束时进行睡眠可以解决问题
或者,当在一个单独的线程中,加入它
在正常操作中,log4net应该在最近的AUDIT调用和执行结束之间有足够的时间 .