【问题标题】:Log4Net not writing to the databaseLog4Net 未写入数据库
【发布时间】:2012-06-16 10:18:07
【问题描述】:

我已经检查了连接字符串(我从服务器资源管理器中得到它)。

我已经检查了 log4net 配置中的 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>

它没有写入任何附加程序。

【问题讨论】:

  • 95% 的时间你在配置上搞砸了。请发布您的 log4net 配置。
  • 非常感谢您的回复 Jeremy,我将准备将其粘贴到此处(删除 conn 字符串等)。谢谢。
  • 添加文件追加器并检查它是否登录文件。如果您可以调试检查记录器上的标志 IsInfoEnabled 等是否为真...
  • 感谢 Felice - 我也尝试了文件附加程序并更新了 OP。

标签: c# sql-server database logging log4net


【解决方案1】:

根据ADONetAppender 配置示例:

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

这使用 ADO.NET 参数化查询格式,因此您需要使用该语法。此外,您可能不想为数据库连接使用集成安全性(尤其是如果您正在运行网站或服务)。对于您的文件附加程序,我推荐一个完全限定的路径,并确保它可以被记录器写入。

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

注意我建议也将trace appender 设置为调试模式,以确保您确实在记录内容。

【讨论】:

  • 非常感谢。表是创建的。一旦我可以设置一组新的数据库凭据,我将不再使用集成安全性,但我已经注意到了,谢谢。我已将文件附加程序的文件属性更改为完全限定的属性 - 仍然没有日志。可写 - 我假设您的意思是允许写入该磁盘?我该如何检查?再次感谢。
  • 无论您在何种安全环境下运行程序集,都需要对该文件夹的写入权限。这应该是基于 NT 的文件权限。
【解决方案2】:

我建议打开 Log4Net 调试:

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

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

【讨论】:

  • 我刚试过这个。我没有发现任何错误,但它仍然没有工作 - 它真的减慢了网络应用程序的速度。
  • 这只是一个故障排除步骤,当然仅用于短时间的调试。我希望您能以这种方式找到错误消息或其他内容。
  • 老实说,这是一个非常有用的步骤,感谢您发布它 - 将来肯定会有用!
  • 有没有办法从生产中运行的软件中获取这些信息? ~90% 的时间我的配置工作,但它会丢失 ~10% 的日志
【解决方案3】:
  1. 检查 log4net.dll 是否与您的应用程序放在同一文件夹中。
  2. 尝试启用log4net自日志,也许会有所帮助:

    <configuration>
     <appSettings>
      <add key="log4net.Internal.Debug" value="true"/>
     </appSettings>
     <system.diagnostics>
      <trace autoflush="true">
       <listeners>
        <add name="textWriterTraceListener"
             type="System.Diagnostics.TextWriterTraceListener"
             initializeData="C:\tmp\log4net.txt" />
       </listeners>
      </trace>
     </system.diagnostics>
    </configuration>
    

另请参阅official log4net FAQ

【讨论】:

  • 刚刚完成。没有创建 log4net.txt。所以我假设没有什么要记录的。
  • 我知道这是旧的,但想说的是 - 如果没有这个,我将无法捕捉到错误!
  • system.diagnostics 帮助我找到了问题。缺少声明“参数”标记的参数之一,并且添加按预期工作。
  • system.diagnostics 将进入配置节点。谢谢,它有效。
  • 你对“数据库”这个标题不了解?
【解决方案4】:

好吧,在拔掉我的头发几个小时后 - 我已经把它弄碎了。

这一行:

log4net.Config.XmlConfigurator.Configure();

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

【讨论】:

  • 恐怕你需要写一个新问题。如果我的解决方案不是您的解决方案,那么您遇到的问题就不会和我的一样。
【解决方案5】:

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

【讨论】:

  • 调试的好方法!
【解决方案6】:

在 AssemblyInfo.cs 文件中添加这一行

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

正如官方配置手册所述“log4net 配置可以使用程序集级属性进行配置,而不是通过编程方式指定”,我发现这是一种更清晰的方法。有些人可能会觉得我的回答更直接。

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

【讨论】:

  • 您能否详细说明并解释这是否回答了问题以及它如何改进以前接受的答案?
  • 正如官方配置手册所述,“log4net 配置可以使用程序集级别的属性进行配置,而不是通过编程方式指定”,我发现这是一种更清晰的方法。有些人可能会觉得我的回答更直截了当。来源:logging.apache.org/log4net/release/manual/configuration.html
  • 感谢@Dimitri!您介意编辑您的答案而不是在评论中发布解释吗?这将使未来的读者变得更容易
  • @GillesGouaillardet,完成,感谢您的 cmets。
【解决方案7】:

对于 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>

【讨论】:

    猜你喜欢
    • 2017-11-05
    • 2018-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    相关资源
    最近更新 更多