我正在将现有应用程序从5升级到6.我的应用程序是.NET Web应用程序。我依靠Enterprise库将任何错误记录到数据库(sql server)。
我的应用程序还使用自定义数据库侦听器和自定义日志异常处理程序(在我的解决方案中都以单独的.net项目的形式)。
所以,我安装了6个,并将以下代码添加到Application_Start -
IConfigurationSource config = ConfigurationSourceFactory.Create();
ExceptionPolicyFactory factory = new ExceptionPolicyFactory(config);
Logger.SetLogWriter(new LogWriterFactory().Create());
ExceptionManager exceptionManager = factory.CreateManager();
当它遇到Logger.SetLogWriter时,我得到一个System.NotImplementedException(new LogWriterFactory()。Create());代码行。
编辑:更具体的错误详情
System.NotImplementedException was unhandled by user code
HResult=-2147467263
Message=Must be implemented by subclasses.
Source=Microsoft.Practices.EnterpriseLibrary.Logging
我做错了什么?
这是我的web.config -
<configSections>
<section name="exceptionHandling" type="Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Configuration.ExceptionHandlingSettings, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling" requirePermission="true" />
<section name="loggingConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.LoggingSettings, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="true" />
<section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="true" />
</configSections>
<loggingConfiguration name="" tracingEnabled="true" defaultCategory="General">
<listeners>
<add name="Database Trace Listener" type="ExtendedPropertyDatabaseListener.ExtendedFormattedDatabaseTraceListener, ExtendedPropertyDatabaseListener" listenerDataType="ExtendedPropertyDatabaseListener.ExtendedFormattedDatabaseTraceListenerData, ExtendedPropertyDatabaseListener" databaseInstanceName="ablmprod" writeLogStoredProcName="Logging.WriteLog" addCategoryStoredProcName="Logging.AddCategory" formatter="Text Formatter" />
<add name="Event Log Trace Listener" type="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.FormattedEventLogTraceListener, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.FormattedEventLogTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" source="Enterprise Library Logging" formatter="Text Formatter" />
</listeners>
<formatters>
<add type="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" template="Timestamp: {timestamp}{newline}
Message: {message}{newline}
Category: {category}{newline}
Priority: {priority}{newline}
EventId: {eventid}{newline}
Severity: {severity}{newline}
Title:{title}{newline}
Machine: {localMachine}{newline}
App Domain: {localAppDomain}{newline}
ProcessId: {localProcessId}{newline}
Process Name: {localProcessName}{newline}
Thread Name: {threadName}{newline}
Win32 ThreadId:{win32ThreadId}{newline}
Extended Properties: {dictionary({key} - {value}{newline})}" name="Text Formatter" />
</formatters>
<categorySources>
<add switchValue="All" name="General">
<listeners>
<add name="Database Trace Listener" />
</listeners>
</add>
</categorySources>
<specialSources>
<allEvents switchValue="All" name="All Events" />
<notProcessed switchValue="All" name="Unprocessed Category" />
<errors switchValue="All" name="Logging Errors & Warnings">
<listeners>
<add name="Event Log Trace Listener" />
</listeners>
</errors>
</specialSources>
</loggingConfiguration>
<exceptionHandling>
<exceptionPolicies>
<add name="Policy">
<exceptionTypes>
<add name="All Exceptions" type="System.Exception, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" postHandlingAction="NotifyRethrow">
<exceptionHandlers>
<add name="Logging Exception Handler" type="CustomExceptionLoggingHandler.CustomExceptionLoggingHandler, CustomExceptionLoggingHandler" logCategory="General" eventId="100" severity="Error" title="Enterprise Library Exception Handling" formatterType="Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.TextExceptionFormatter, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling" priority="0" />
</exceptionHandlers>
</add>
</exceptionTypes>
</add>
</exceptionPolicies>
</exceptionHandling>
编辑: 感谢@lrb让我走上了正确的道路。这是有效的代码 -
protected void Application_Start()
{
LoggingConfiguration loggingConfiguration = BuildLoggingConfig();
LogWriter logWriter = new LogWriter(loggingConfiguration);
Logger.SetLogWriter(logWriter, false);
ExceptionPolicy.SetExceptionManager(exManager);
// Create the default ExceptionManager object programatically
exManager = BuildExceptionManagerConfig(logWriter);
// Create an ExceptionPolicy to illustrate the static HandleException method
ExceptionPolicy.SetExceptionManager(exManager);
...
}
private static LoggingConfiguration BuildLoggingConfig()
{
// Formatters
var config = new LoggingConfiguration();
return config;
}
private static ExceptionManager BuildExceptionManagerConfig(LogWriter logWriter)
{
var policies = new List<ExceptionPolicyDefinition>();
var logAndWrap = new List<ExceptionPolicyEntry>
{
new ExceptionPolicyEntry(typeof (Exception),
PostHandlingAction.ThrowNewException,
new IExceptionHandler[]
{
new WrapHandler("An application error has occurred.",
typeof(APIAvailabilityException))
})
};
policies.Add(new ExceptionPolicyDefinition("Policy", logAndWrap));
return new ExceptionManager(policies);
}
答案 0 :(得分:0)
ThrowIfSet
方法的可选SetLogWriter
参数。文档说明:
throwIfSet :如果已设置编写器,则返回异常;否则是假的。默认为true。
IConfigurationSource configurationSource = ConfigurationSourceFactory.Create();
LogWriterFactory logWriterFactory = new LogWriterFactory(configurationSource);
Logger.SetLogWriter(logWriterFactory.Create(),false);
Logger.Write(le);
答案 1 :(得分:0)
对于那些仍然存在此问题并且建议的解决方案无效的人,可以获得更多信息。
此异常的一个可能原因是CoreBuildTraceListener
方法未在您的自定义TraceListenerData
类中实现(如果您使用的话)。
在我的情况下,我必须添加以下内容才能使其正常工作(代码特定于我的实现):
protected override TraceListener CoreBuildTraceListener(LoggingSettings settings)
{
return new RollingXmlTraceListener(
this.FileName,
this.RollSizeKB,
this.TimeStampPattern,
this.RollFileExistsBehavior,
this.RollInterval,
this.MaxArchivedFiles);
}