【问题标题】:Log4Net DB logging working on Development but not Live serverLog4Net DB 日志记录在 Development 但不是 Live 服务器
【发布时间】:2026-01-11 12:05:04
【问题描述】:

我们在我们的一个服务应用程序上使用 Log4Net 日志记录到文件和数据库。在我们的开发服务器上,两种日志记录类型都可以正常工作。但是,在我们的暂存和实时服务器上,数据库日志记录不起作用。但是,文件日志记录工作正常。

我已经确认 SQL 权限是正确的,并且两个系统上的日志表/触发器/约束都相同。

我应该提到我们正在使用配置转换来更改将根据我们的环境记录到的数据库。但是,我可以确认将正确的数据库注入到配置中。

由于其他限制,我目前无法启用 log4Net 调试日志记录。还有什么需要检查的吗?其他配置?还是我必须想办法让我们启用 log4Net 调试。

可以在下面找到配置(Sql 配置已编辑):

<connectionStrings>
    <clear />
    <add name="log4netdb" providerName="System.Data.SqlClient"
    connectionString="Data Source=[dbname];Initial Catalog=[tableName];
    User Id=[username];Password=[password];" />
</connectionStrings>

Log4Net 配置:

<log4net>
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
  <file value="Scheduler_Log.txt" />
  <appendToFile value="true" />
  <rollingStyle value="Size" />
  <maxSizeRollBackups value="0" />
  <maximumFileSize value="10MB" />
  <staticLogFileName value="true" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
  </layout>
</appender>
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
  <bufferSize value="1" />
  <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  <connectionString value="log4netdb" />
  <commandText value="INSERT INTO LOG ([Date],[Application],[UserName],[Thread],[Level],[Logger],[Message],[Exception],[class],[method],[line]) VALUES (@log_date, @application, @user, @thread, @log_level, @logger, @message, @exception, @class, @method, @line)" />
  <parameter>
    <parameterName value="@log_date" />
    <dbType value="DateTime" />
    <layout type="log4net.Layout.RawTimeStampLayout" />
  </parameter>
  <parameter>
    <parameterName value="@thread" />
    <dbType value="String" />
    <size value="255" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%thread" />
    </layout>
  </parameter>
  <parameter>
    <parameterName value="@log_level" />
    <dbType value="String" />
    <size value="50" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%level" />
    </layout>
  </parameter>
  <parameter>
    <parameterName value="@logger" />
    <dbType value="String" />
    <size value="255" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%logger" />
    </layout>
  </parameter>
  <parameter>
    <parameterName value="@message" />
    <dbType value="String" />
    <size value="4000" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%message" />
    </layout>
  </parameter>
  <parameter>
    <parameterName value="@exception" />
    <dbType value="String" />
    <size value="2000" />
    <layout type="log4net.Layout.ExceptionLayout" />
  </parameter>
  <parameter>
    <parameterName value="@application" />
    <dbType value="string" />
    <size value="255" />
    <layout type="log4net.Layout.RawPropertyLayout">
      <key value="log4japp" />
      <conversionPattern value="%property{log4japp}" />
    </layout>
  </parameter>
  <parameter>
    <parameterName value="@user" />
    <dbType value="string" />
    <size value="100" />
    <layout type="log4net.Layout.RawPropertyLayout">
      <key value="log4net:UserName" />
      <conversionPattern value="%property{log4net:UserName}" />
    </layout>
  </parameter>
  <parameter>
    <parameterName value="@class" />
    <dbType value="String" />
    <size value="255" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%class" />
    </layout>
  </parameter>
  <parameter>
    <parameterName value="@method" />
    <dbType value="String" />
    <size value="255" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%method" />
    </layout>
  </parameter>
  <parameter>
    <parameterName value="@line" />
    <dbType value="String" />
    <size value="4" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%line" />
    </layout>
  </parameter>
</appender>
<root>
  <level value="INFO" />
  <appender-ref ref="RollingFileAppender" />
  <appender-ref ref="AdoNetAppender" />
</root>

【问题讨论】:

  • 我想到了一些快速的事情,1. SQL 服务器可以从 prod 机器访问吗? 2. dbo 是 LOG 表的所有者吗?您是否有权查看 prod 框上的事件日志以检查其中是否有任何错误?
  • 是的,是的,是的,不幸的是,这些都没有提供更多的洞察力。
  • 从 log4net 1.12 开始,您可以在 log4net 配置中按名称引用连接字符串 - &lt;connectionStringName value="log4netdb" /&gt;
  • 如果你没有注意到这正是我想要做的!
  • 我注意到你的配置中有&lt;connectionString value="log4netdb" /&gt; - 那是connectionString 而不是connectionStringName,这就是它不起作用的原因。

标签: .net log4net


【解决方案1】:

我最终找到了一个解决方案,它使用转换直接替换 log4Net 配置部分中的连接字符串,而不是连接字符串。

<log4net>
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender" xdt:Locator="Match(name)">
  <connectionString value="Data Source=[server];Initial Catalog=[table];User Id=[user];Password=[password];" xdt:Transform="Replace"/>
</appender>

【讨论】:

    最近更新 更多