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
奇怪,但我的 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