2012-03-14 59 views
0

我的項目是相當大的,它包括IIS服務器和Windows服務,甚至一些UNIX/CGI服務,以及將與WCF框架讀取異常塊

它將包括3層,一MVC網站女士,多服務網關等。

我想知道你會爲我推薦哪種異常處理機制。

我在尋找一些多才多藝的東西,但我們不想過度。我檢查出ELMAH

從我理解ELMAH使用HttpModules,所以它不會與我的Windows服務一起工作,而無需調整一下。

你有其他建議嗎?

p.s.
我沒有層之間的安全問題。他們都在我的域名

+2

請問您可以定義「異常處理機制」嗎?下面提到的ELMAH和log4net都是日誌解決方案,而不是異常處理;您仍然需要編寫代碼來捕獲異常並將其記錄下來。你想要這個機制爲你做什麼? – 2012-03-14 17:16:03

+0

我們正在尋找異常塊,如(企業庫塊)EL 5.我們將在MVC和其他數據領域使用EntityFramework。 我只是覺得EL對我們來說可能太複雜了,也許會t EL ELMAH來接受Windows服務異常會是更好的方法。我們會定製例外情況,但所有重新包裝和安全刪除都超出了我們項目所需的範圍。這不會讓我錯誤是非常大的。將包括10個服務模塊,每個模塊都有自己的數據中心和服務定位器。 – 2012-03-15 11:18:53

+1

讓我改述一下:你想讓這個異常處理機制實際執行什麼操作?你想要滿足什麼用例?它只是「登錄我的例外」,還是你需要集中的異常屏蔽,包裝,轉換等? – 2012-03-15 16:56:55

回答

1

使用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服務。

希望它能幫助你。

+0

Tuzo,謝謝你的建議。我不是NIH的人,但這是我們正在考慮的事情。我肯定會認真考慮這一點,至少要創建一個測試項目來檢查這一點。雖然這是一個記錄器,但不是異常處理程序或事件偵聽器。但感謝您的詳細解釋。 :) – 2012-03-18 10:03:39