C#控制台应用log4net数据库日志EntryID异常排查求助
排查log4net EntryID填充异常的思路
针对你遇到的EntryID未按预期填充的问题,可按以下步骤排查:
确认
%entryid转换符的来源
log4net原生没有%entryid这个内置转换模式,当前配置中的%entryid要么是自定义转换器,要么是读取了log4net的上下文属性:- 检查项目中是否存在继承自
log4net.Layout.Pattern.PatternConverter的自定义转换器类(比如EntryIdConverter),查看其Convert方法的实现逻辑,确认EntryID的生成规则; - 对比
severityId的配置,你的severityId明确注册了自定义转换器QCSeverityConverter,但entryid参数的配置中没有对应的<converter>节点,如果EntryID需要自定义生成,这可能是配置遗漏点。
- 检查项目中是否存在继承自
检查log4net上下文属性设置
查看代码中是否通过以下方式设置过EntryID的值:// 全局上下文 log4net.GlobalContext.Properties["entryid"] = "xxx"; // 线程上下文 log4net.ThreadContext.Properties["entryid"] = "xxx";如果存在这类代码,确认设置逻辑是否正确,是否在日志写入前被覆盖或未正确赋值,可在日志语句前后打印属性值验证。
排查自定义AdoNetAppender的逻辑
你使用的是ToolsCommon.logging.AdoNetAppender而非log4net原生的log4net.Appender.AdoNetAppender,需要检查这个自定义Appender的实现:- 是否重写了参数填充的逻辑,比如自动为
@entryid参数赋值,忽略配置中的Layout设置; - 查看该类的代码(或反编译),确认对EntryID参数的处理逻辑。
- 是否重写了参数填充的逻辑,比如自动为
启用log4net内部调试日志
开启log4net的内部调试,查看它处理%entryid转换的过程:
在项目的app.config或web.config中添加以下配置:<appSettings> <add key="log4net.Internal.Debug" value="true"/> </appSettings> <system.diagnostics> <trace autoflush="true"> <listeners> <add name="log4netDebugListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="log4net_internal.log"/> </listeners> </trace> </system.diagnostics>运行程序后查看生成的
log4net_internal.log,搜索与entryid、PatternLayout转换相关的日志,确认是否有转换错误或使用了未预期的转换器。测试最小化配置
简化配置进行测试:- 暂时只保留
DatabaseAppender,将entryid参数的转换模式改为固定值,比如:<parameter> <parameterName value="@entryid" /> <dbType value="String" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="TEST_ENTRY_ID" /> </layout> </parameter> - 运行程序查看数据库中EntryID的值,如果是
TEST_ENTRY_ID,说明原%entryid转换存在问题;如果仍然是未知值,说明自定义AdoNetAppender或数据库端有额外赋值逻辑。
- 暂时只保留
检查数据库字段配置
查看Log表的EntryID字段是否设置了默认值(比如NEWID()、自增序列等),如果log4net没有正确传入值,数据库会使用字段默认值填充,这也会导致出现"未知来源"的值。
内容的提问来源于stack exchange,提问作者joma
相关产品推荐
相关产品推荐

