我的項目是相當大的,它包括IIS服務器和Windows服務,甚至一些UNIX/CGI服務,以及將與WCF框架讀取異常塊
它將包括3層,一MVC網站女士,多服務網關等。
我想知道你會爲我推薦哪種異常處理機制。
我在尋找一些多才多藝的東西,但我們不想過度。我檢查出ELMAH
從我理解ELMAH使用HttpModules,所以它不會與我的Windows服務一起工作,而無需調整一下。
你有其他建議嗎?
p.s.
我沒有層之間的安全問題。他們都在我的域名
我的項目是相當大的,它包括IIS服務器和Windows服務,甚至一些UNIX/CGI服務,以及將與WCF框架讀取異常塊
它將包括3層,一MVC網站女士,多服務網關等。
我想知道你會爲我推薦哪種異常處理機制。
我在尋找一些多才多藝的東西,但我們不想過度。我檢查出ELMAH
從我理解ELMAH使用HttpModules,所以它不會與我的Windows服務一起工作,而無需調整一下。
你有其他建議嗎?
p.s.
我沒有層之間的安全問題。他們都在我的域名
使用log4net。爲了使它更健壯,你需要創建另一個WCF服務,它只是將你的異常,錯誤或消息記錄到你的數據庫中。
對此的步驟。
1 - 修改客戶機應用程序的web.config /的app.config
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
</configuration>
2 - 下面添加log4net的部分。
<log4net>
<appender name="WcfAppender" type="Problem.Common.Logging.WcfAppender, Problem.Common">
<endpointAddress value="http://localhost.poc.trunk.site-dev.local/Services/Log.svc"/>
</appender>
<appender name="FileAppender" type="log4net.Appender.FileAppender">
<file value="log.log" />
<appendToFile value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date{dd-MM-yyyy HH:mm:ss} %message%newline" />
</layout>
</appender>
<appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender">
<target value="Console.Error" />
<mapping>
<level value="FATAL" />
<foreColor value="Red" />
<backColor value="White" />
</mapping>
<mapping>
<level value="ERROR" />
<foreColor value="Red, HighIntensity" />
</mapping>
<mapping>
<level value="WARN" />
<foreColor value="Yellow" />
</mapping>
<mapping>
<level value="INFO" />
<foreColor value="Cyan" />
</mapping>
<mapping>
<level value="DEBUG" />
<foreColor value="Green" />
</mapping>
<layout type="log4net.Layout.SimpleLayout" />
</appender>
<logger name="WcfLogger">
<level value="ALL" />
<appender-ref ref="WcfAppender" />
<appender-ref ref="ColoredConsoleAppender" />
</logger>
<logger name="FileLogger">
<level value="ALL" />
<appender-ref ref="FileAppender" />
<appender-ref ref="ColoredConsoleAppender" />
</logger>
</log4net>
3 - 創建log.svc,如下所述。
namespace Problem.CustomerCore.Services
{
using System;
using System.ServiceModel;
using Common.ExceptionHandling;
using log4net;
using log4net.Core;
/// <summary>
/// Service contract for instrumentation operations - such as logging and performance tracking
/// </summary>
[ServiceContract]
public interface ILogPOC
{
/// <summary>
/// Writes an entry to the logging framework
/// </summary>
/// <param name="logDateTime">The timestamp that the event occurred</param>
/// <param name="logLevel">The level of the event</param>
/// <param name="host">The host on which the event occurred</param>
/// <param name="loggerName">The name of the type that originally raised the exception</param>
/// <param name="message">The message describing the event context</param>
/// <param name="exception">Excpetion object in case of the log entry being an error</param>
/// <param name="version">The version number of the component reporting the log entry</param>
/// <param name="tenancyExternalReference">The external reference identifying the current tenancy.</param>
[OperationContract]
[FaultContract(typeof(ProcessingResultsList))]
void WriteLogEntry(DateTime logDateTime, Level logLevel, string host, string loggerName, string message, string exception, string version, Guid tenancyExternalReference);
}
/// <summary>
/// Methods for instrumenting the application
/// </summary>
public class Log : ILogPOC
{
/// <summary>
/// The logger to use for writing out exceptions nad info logs
/// </summary>
private static ILog logger = LogManager.GetLogger(typeof(Instrumentation));
/// <summary>
/// Writes an entry to the logging framework
/// </summary>
/// <param name="logDateTime">The timestamp that the event occurred</param>
/// <param name="logLevel">The level of the event</param>
/// <param name="host">The host on which the event occurred</param>
/// <param name="loggerName">The name of the type that originally raised the exception</param>
/// <param name="message">The message describing the event context</param>
/// <param name="exception">Excpetion object in case of the log entry being an error</param>
/// <param name="version">The version number of the component reporting the log entry</param>
/// <param name="tenancyExternalReference">The external reference identifying the current tenancy.</param>
public void WriteLogEntry(DateTime logDateTime, Level logLevel, string host, string loggerName, string message, string exception, string version, Guid tenancyExternalReference)
{
log4net.Config.XmlConfigurator.Configure();
ThreadContext.Properties["Host"] = host;
ThreadContext.Properties["Version"] = version;
ThreadContext.Properties["Tenancy"] = tenancyExternalReference;
ThreadContext.Properties["User"] = System.Threading.Thread.CurrentPrincipal.Identity.Name;
var eventData = new LoggingEventData
{
Identity = System.Threading.Thread.CurrentPrincipal.Identity.Name,
UserName = System.Threading.Thread.CurrentPrincipal.Identity.Name,
Level = logLevel,
LoggerName = loggerName,
TimeStamp = logDateTime,
Message = message,
ExceptionString = exception
};
var logEvent = new LoggingEvent(eventData);
// log the exception
logger.Logger.Log(logEvent);
}
}
}
4 - 在數據庫中也創建一個日誌表。
5 - WCF的Web.config應該如下所示。特別是log4net部分。
<log4net>
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=4.0.30319.1, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
<bufferSize value="100" />
<lossy value="true" />
<evaluator type="log4net.Core.LevelEvaluator">
<threshold value="INFO"/>
</evaluator>
<connectionString value="Database=XYZ-trunk;Server=localhost;User ID=a;Password=b;Trusted_Connection=False;" />
<connectionStringName value="connectionException" />
<commandText value="[dbo].[spLog_WriteEntry]" />
<commandType value="StoredProcedure" />
<parameter>
<parameterName value="@LogDateTime" />
<dbType value="DateTime" />
<layout type="log4net.Layout.RawTimeStampLayout" />
</parameter>
<parameter>
<parameterName value="@Component" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout" value="%logger" />
</parameter>
<parameter>
<parameterName value="@LogLevel" />
<dbType value="String" />
<size value="50" />
<layout type="log4net.Layout.PatternLayout" value="%level" />
</parameter>
<parameter>
<parameterName value="@Host" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%property{Host}"/>
</layout>
</parameter>
<parameter>
<parameterName value="@Message" />
<dbType value="String" />
<size value="4000" />
<layout type="log4net.Layout.PatternLayout" value="%message" />
</parameter>
<parameter>
<parameterName value="@Exception" />
<dbType value="String" />
<size value="2000" />
<layout type="log4net.Layout.ExceptionLayout" />
</parameter>
<parameter>
<parameterName value="@Coulmn1" />
<dbType value="String" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%property{Tenancy}"/>
</layout>
</parameter>
<parameter>
<parameterName value="@Username" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%property{User}"/>
</layout>
</parameter>
</appender>
<appender name="SmtpAppender" type="log4net.Appender.SmtpAppender">
<threshold value="WARN"/>
<to value="[email protected]" />
<from value="[email protected]" />
<subject value="SmtpAppender" />
<smtpHost value="xyz.com" />
<bufferSize value="512" />
<lossy value="false" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%newline%date [%thread] %-5level %logger [%property{NDC}] - %message%newline%newline%newline" />
</layout>
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="AdoNetAppender" />
</root>
</log4net>
現在你設置你的WCF服務。
希望它能幫助你。
Tuzo,謝謝你的建議。我不是NIH的人,但這是我們正在考慮的事情。我肯定會認真考慮這一點,至少要創建一個測試項目來檢查這一點。雖然這是一個記錄器,但不是異常處理程序或事件偵聽器。但感謝您的詳細解釋。 :) – 2012-03-18 10:03:39
請問您可以定義「異常處理機制」嗎?下面提到的ELMAH和log4net都是日誌解決方案,而不是異常處理;您仍然需要編寫代碼來捕獲異常並將其記錄下來。你想要這個機制爲你做什麼? – 2012-03-14 17:16:03
我們正在尋找異常塊,如(企業庫塊)EL 5.我們將在MVC和其他數據領域使用EntityFramework。 我只是覺得EL對我們來說可能太複雜了,也許會t EL ELMAH來接受Windows服務異常會是更好的方法。我們會定製例外情況,但所有重新包裝和安全刪除都超出了我們項目所需的範圍。這不會讓我錯誤是非常大的。將包括10個服務模塊,每個模塊都有自己的數據中心和服務定位器。 – 2012-03-15 11:18:53
讓我改述一下:你想讓這個異常處理機制實際執行什麼操作?你想要滿足什麼用例?它只是「登錄我的例外」,還是你需要集中的異常屏蔽,包裝,轉換等? – 2012-03-15 16:56:55