You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#控制台应用log4net数据库日志EntryID异常排查求助

排查log4net EntryID填充异常的思路

针对你遇到的EntryID未按预期填充的问题,可按以下步骤排查:

  • 确认%entryid转换符的来源
    log4net原生没有%entryid这个内置转换模式,当前配置中的%entryid要么是自定义转换器,要么是读取了log4net的上下文属性:

    1. 检查项目中是否存在继承自log4net.Layout.Pattern.PatternConverter的自定义转换器类(比如EntryIdConverter),查看其Convert方法的实现逻辑,确认EntryID的生成规则;
    2. 对比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的实现:

    1. 是否重写了参数填充的逻辑,比如自动为@entryid参数赋值,忽略配置中的Layout设置;
    2. 查看该类的代码(或反编译),确认对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转换相关的日志,确认是否有转换错误或使用了未预期的转换器。

  • 测试最小化配置
    简化配置进行测试:

    1. 暂时只保留DatabaseAppender,将entryid参数的转换模式改为固定值,比如:
      <parameter>
          <parameterName value="@entryid" />
          <dbType value="String" />
          <layout type="log4net.Layout.PatternLayout">
              <conversionPattern value="TEST_ENTRY_ID" />
          </layout>
      </parameter>
      
    2. 运行程序查看数据库中EntryID的值,如果是TEST_ENTRY_ID,说明原%entryid转换存在问题;如果仍然是未知值,说明自定义AdoNetAppender或数据库端有额外赋值逻辑。
  • 检查数据库字段配置
    查看Log表的EntryID字段是否设置了默认值(比如NEWID()、自增序列等),如果log4net没有正确传入值,数据库会使用字段默认值填充,这也会导致出现"未知来源"的值。

内容的提问来源于stack exchange,提问作者joma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 05:16:35