.net - log4net 没有登录到数据库

标签 .net log4net log4net-configuration

我有一个奇怪的问题,我的 log4net 设置没有将任何数据记录到数据库中,也没有引发任何异常来通知问题。 我在一个名为“Log4net.Config”的单独文件中定义了配置设置,并且 在程序集中引用了它。 (请注意,我通过 nuget lib 安装了 Log4net lib)

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.config", Watch = true)]

这是日志文件。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>
  <log4net>
    <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
      <bufferSize value="1" />
      <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      <connectionString value="Data Source=(local);Initial Catalog=testdb;Integrated Security=True" />
      <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
      <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>
    </appender>
  </log4net>
</configuration>

我像这样访问它:

 log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

 System.Console.ReadLine();
 log.Debug("This is a debug object");                
 log.Error("ex", new Exception("dfdf"));

您是否发现任何问题?

最佳答案

log4net 在设计上不会引发异常,其基本原理是即使日志配置错误,应用程序仍应运行。

一个独立的 log4net 配置文件应该只包含 log4net 配置部分,所以你的 log4net.config 文件以这个开头:

<?xml version="1.0" standalone="yes"?>
<log4net>
  <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
    <bufferSize value="1" /> …

另外,你已经定义了 appenders,但是你还没有定义一个 logger,所以你需要在 log4net.config 中添加这样的东西:

<root>
  <level value="DEBUG" />
  <appender-ref ref="AdoNetAppender" />
</root>

(根记录器是默认记录器,您设置最低日志级别和要使用的附加程序)

如果修复文件后仍有问题,请在 log4net.config 文件中将 log4net 设置为 Debug模式,并将 TraceListener 部分添加到您的 app.config(或 web.config,具体取决于项目类型):

<log4net debug="true">
      <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender"> …

在 app.config 中:

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

log4net初始化时,会将调试信息写入指定文件。

请注意,由于您已使用程序集属性来初始化日志记录,因此您可以使用 ight need to add a GetLogger call during your program startup :

Using attributes can be a clearer method for defining where the application's configuration will be loaded from. However it is worth noting that attributes are purely passive. They are information only. Therefore if you use configuration attributes you must invoke log4net to allow it to read the attributes. A simple call to LogManager.GetLogger will cause the attributes on the calling assembly to be read and processed. Therefore it is imperative to make a logging call as early as possible during the application start-up, and certainly before any external assemblies have been loaded and invoked.

关于.net - log4net 没有登录到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24837461/

相关文章:

c# - 无法使用 .NET 验证 JSON Web token - key 太短

c# - 什么版本的 .Net 框架应该针对最终用户应用程序

log4net - 在 log4net 中启用日志级别

c# - 无法创建类型 'Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4Net'

.net - 如何赋予程序比启动它的用户更多的权限

c# - 如何正确添加 WebRequest header ?

c# - 有人能告诉我我的 log4net 配置/实现有什么问题吗?

log4net - ASP.Net Core 2.0 Web Api 设置 log4net

.net - Log4net 不会登录到控制台(WinForms 应用程序)

带有 EventLogAppender 的 log4net 不记录