log4net 没有将异常记录到数据库,没有显示错误

log4net is not logging exceptions to database, no errors displayed

奇怪,但我的 MVC4 应用程序没有将异常记录到数据库。当出现异常时启动ExceptionHandlingAttribute,应该创建日志条目,但实际上没有。 VS 的调试 window 或事件浏览器中没有显示 log4not 的错误。 Log4net 配置是 运行 命令`log4net.Config.XmlConfigurator.Configure();在 Global.asax 的方法中 Application_Start.

如何让log4net显示配置错误信息?

代码:

public class ExceptionHandlingAttribute : IExceptionFilter
    {
        public  void OnException(ExceptionContext filterContext)
        {
            log4net.ILog logger = log4net.LogManager.GetLogger(typeof(MvcApplication));
            logger.Error(filterContext.Exception.Message, filterContext.Exception);
            Debug.WriteLine(string.Format("Exception: {0}", filterContext.Exception.Message));
        }
    }

配置:

<?xml version="1.0" encoding="utf-8"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  http://go.microsoft.com/fwlink/?LinkId=152368
  -->
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>
  <system.diagnostics />
  <connectionStrings>         
    <!--
    <add name="MembershipConnection"  ....

  </connectionStrings>
  <appSettings>
    <!-- app settings starts -->
    ...
    <add key="log4net.Internal.Debug" value="true"/>
  </appSettings>
  <system.web>

    <customErrors mode="On" />

    <globalization uiCulture="en-GB" culture="en-GB" />
    <compilation debug="true" targetFramework="4.0">
      <assemblies>
       ...
      </assemblies>
    </compilation>
    <authentication mode="Forms">
      <forms loginUrl="~/Account/LogIn" timeout="2880" />
    </authentication>
    <httpRuntime />
    <profile defaultProvider="DefaultProfileProvider">
      <providers>
       ...
      </providers>
    </sessionState>
    <pages controlRenderingCompatibilityVersion="4.0">
      <namespaces>
      ...
      </namespaces>
    </pages>
    <!--
    <siteMap defaultProvider="CustomSiteMapProvider" enabled="true">
      <providers>
        <clear/>
        <add name="CustomSiteMapProvider" type="MvcWebRole1.Controllers.CustomSiteMapProvider"/>
      </providers>
    </siteMap>
    -->
  </system.web>
  <system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <staticContent>
      <mimeMap fileExtension=".json" mimeType="application/json" />
    </staticContent>
    <!-- turn off gzipped response-->
   <urlCompression doStaticCompression="false" doDynamicCompression="false" />
  </system.webServer>
  <runtime>
   ...
  </runtime>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v11.0" />
      </parameters>
    </defaultConnectionFactory>
  </entityFramework>
  <log4net>
    <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
      <bufferSize value="100" />
      <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      <connectionString value="data source=.\SQLEXPRESS;initial catalog=devDB;integrated security=true;" />

      <commandText value="INSERT INTO Logs ([Level], [Logger], [Message], [Exception], [AccountId], [TimeStamp]) VALUES (@log_level, @logger, @message, @exception, @account_id, @log_date)" />
      <parameter>
        <parameterName value="@log_level" />
        <dbType value="String" />
        <size value="30" />
        <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="255" />
        <layout type="log4net.Layout.ExceptionLayout" />
      </parameter>
      <parameter>
        <parameterName value="@exception" />
        <dbType value="String" />
        <size value="2000" />
        <layout type="log4net.Layout.ExceptionLayout" />
      </parameter>
      <parameter>
        <parameterName value="@account_id" />
        <dbType value="Int32" />
        <size value="32" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%message" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@log_date" />
        <dbType value="DateTime" />
        <layout type="log4net.Layout.RawTimeStampLayout" />
      </parameter>
    </appender>

    <!-- Set root logger level to DEBUG and its only appender to A1 -->
    <root>
      <level value="ALL" />
      <appender-ref ref="AdoNetAppender" />
    </root>
  </log4net>
</configuration>

工作SELECT代码:

SELECT TOP 1000 [Id]
      ,[Level]
      ,[Logger]
      ,[Message]
      ,[Exception]
      ,[AccountId]
      ,[TimeStamp]
  FROM [devDB].[dbo].[Logs]

更新 1)

log4net 已重新安装到版本“2.0.2”(nuget) =>“1.2.12”,但仍然无法正常工作。

更新 2) 我修复了配置文件,现在可以使用了,但还不完全:).

当应用程序在本地启动并模拟异常时,日志不会在数据库中创建,而是保存在某个地方:)。当应用程序关闭时,SQL 日志 table 中仍然没有数据。但是当应用程序再次启动时,日志出现在 sql table 中。怎么了:)?

已解决: 我不得不将缓冲区大小从 100 更改为 1:),当缓冲区未满时,不会保存数据:)

<log4net>
    <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
      <bufferSize value="1" />

您可以打开内部调试,看看额外的信息是否告诉您问题所在。

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

http://logging.apache.org/log4net/release/faq.html and How to track down log4net problems