奇怪,但我的MVC4應用程序沒有記錄數據庫的異常。當異常出現ExceptionHandlingAttribute時,應該創建日誌條目,但不是。 VS的調試窗口或事件瀏覽器中不會顯示log4not錯誤。 Log4net配置由命令`log4net.Config.XmlConfigurator.Configure();運行。在Global.asax的方法Application_Start中。log4net沒有記錄數據庫的異常,沒有顯示錯誤
如何讓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日誌表中仍然沒有數據。但是當應用程序再次啓動時,日誌出現在sql表中。哪裏不對:)?
解決: 我不得不改變緩衝區的大小從100到1 :),當緩衝器未滿,數據不會被保存:)
<log4net>
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
<bufferSize value="1" />
你已經升級到1.2.14 log4net的?在該版本中有一個[已知問題](https://issues.apache.org/jira/browse/LOG4NET-489)與ADONetAppender。如果沒有,[啓用log4net內部調試](http://haacked.com/archive/2006/09/27/Log4Net_Troubleshooting.aspx/)並查看記錄的內容。 – stuartd
是的,我的版本是1.2.14.0 :) ...我會降級它。謝謝 –
已經完整的解決方案[這裏](http://stackoverflow.com/questions/3971250/log4net-configuration-from-assembly-attribute-does-not-load-configuration-file/35124349#35124349) – adnan