Log4Net没有写入数据库

问题描述 投票:9回答:7

我检查了连接字符串(我从服务器资源管理器中获取)。

我在log4net config中检查了commandText。

我已经检查了数据库权限(集成安全性很好,并且在log4net类之外工作)。

我已经检查了存储库的配置属性(它已配置,它找到配置文件正常)。

我还检查了配置文件中定义的字段是否与数据库中表的属性(字段大小等)相匹配。

有任何想法吗?

当我正在调试它似乎在所有正确的时间点击所有正确的方法,没有异常提出。

<log4net>

  <appender name="ADONetAppender" type="log4net.Appender.ADONetAppender">
    <bufferSize value="1" />
    <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    <connectionString value="" />
    <commandText value="INSERT INTO dbo.Log4Net ([Date],[Thread],[Level],[Logger],[Message]) VALUES ('01-01-2001', 'test', 'test', 'test', 'test')"/>
    <!--<commandText value="INSERT INTO dbo.Log4Net ([Date],[Thread],[Level],[Logger],[Message],[Exception],[MachineName],[CultureId],[SourcePage],[Details],[Method]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception, @MachineName, @CultureId, @SourcePage, @Details, @Method)" />-->
    <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>

...more parameters

    <securitycontext type="log4net.Util.WindowsSecurityContext">
      <credentials value="Process">
      </credentials>
    </securitycontext>
  </appender>

  <appender name="FileAppender" type="log4net.Appender.FileAppender">
    <param name="File" value="LogTest.txt"/>
    <param name="AppendToFile" value="true"/>
    <layout type="log4net.Layout.PatternLayout">
      <param name="ConversionPattern" value="%d [%t] %-2p %c [%x] - %m%n"/>
    </layout>
  </appender>

  <root>
    <appender-ref ref="ADONetAppender"/>
    <appender-ref ref="FileAppender"/>
  </root>

</log4net>

它写的都不是appender。

c# sql-server database logging log4net
7个回答
18
投票

好吧,经过几个小时的拔毛 - 我已经破了。

这一行:

log4net.Config.XmlConfigurator.Configure();

在任何日志记录之前需要输入(好吧,尽早在应用程序中)。而已。这就是全部。这是其中一个问题,我很放心,但同时感到沮丧。


10
投票

我建议打开Log4Net调试:

<add key="log4net.Internal.Debug" value="true"/>

如果在幕后发生错误,这可能会指向正确的方向。输出将定向到IDE或命令行中的控制台输出。


9
投票
  1. 检查log4net.dll是否与应用程序位于同一文件夹中。
  2. 尝试启用log4net自我记录,也许它有助于找出: <configuration><appSettings> <add key="log4net.Internal.Debug" value="true"/> </appSettings> </configuration> <system.diagnostics> <trace autoflush="true"> <listeners> <add name="textWriterTraceListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="C:\tmp\log4net.txt" /> </listeners> </trace> </system.diagnostics>

2
投票

根据ADONetAppender配置示例:

<commandText value="INSERT INTO dbo.Log4Net 
    ([Date],[Thread],[Level],[Logger],[Message]) 
    VALUES (@log_date, @thread, @log_level, @logger, @message)"/>

这使用ADO.NET参数化查询格式,因此您需要使用该语法。此外,您可能不希望为数据库连接使用集成安全性(例如,如果您正在运行网站或服务)。对于您的文件追加器,我建议使用完全限定的路径,并确保它可由记录器写入。

我假设您已经在指定的数据库中创建了表?

注意我建议在调试模式下设置trace appender,以确保您实际记录的东西。


2
投票

昨天我遇到了类似的问题,Log4Net只是没有写入数据库。我从另一个成功将日志写入数据库的现有appender复制了配置。我的解决方案是运行SQL Server Profiler来尝试捕获正在发生的事情。 Profiler显示INSERT语句是由Log4Net发送的,但它在SQL Server端失败了。在SQL Server Management Studio中手动运行INSERT语句向我显示了它究竟出了什么问题,在我的例子中,它将NULL插入到不接受NULL的列中。


1
投票

在AssemblyInfo.cs文件中添加此行

[assembly: log4net.Config.XmlConfigurator(Watch = true)]

正如官方配置手册所述“可以使用汇编级属性配置log4net配置而不是以编程方式指定”,我发现这是一种更清晰的方法。有些人可能会觉得我的答案更简单。

资料来源:https://logging.apache.org/log4net/release/manual/configuration.html


0
投票

对于sql server连接我正在使用我的真实帐户登录到azure和sql server,因为我必须将集成安全性更改为“SSPI”而不是“true”才行

只是通过添加它才发现它是con字符串

<system.diagnostics>
<trace autoflush="true">
  <listeners>
    <add
        name="textWriterTraceListener"
        type="System.Diagnostics.TextWriterTraceListener"
        initializeData="C:\Logs\log4net.txt" />
  </listeners>
</trace>

© www.soinside.com 2019 - 2024. All rights reserved.