2012-03-14 3 views
0

내 프로젝트가예외 블록

그것은 3 층, 포함됩니다 WCF 프레임 워크를 읽을 수 있습니다뿐만 아니라 IIS 서버와 Windows 서비스, 심지어 일부 UNIX/CGI 서비스가 포함 꽤 큰 Ms MVC 웹 사이트, 다중 서비스 게이트웨이 등.

어떤 예외 처리 메커니즘을 사용 하시겠습니까?

나는 다재다능한 것을 찾고 있지만, 우리는 배 밖으로 나가고 싶지 않습니다. 나는 ELMAH를 체크 아웃했다

내가 ELMAH가 HttpModules를 사용하여 약간 조정하지 않고 내 Windows 서비스에서 작동하지 않는다는 것을 알 수있다.

다른 것을 권하고 싶니?

p.s.
레이어간에 보안 문제가 없습니다. 그들은 모두 내 도메인에 있습니다

+2

"예외 처리 메커니즘"을 정의 할 수 있습니까? 아래에 언급 된 ELMAH 및 log4net은 예외 처리가 아닌 로깅 솔루션입니다. 당신은 여전히 ​​예외를 잡아서 기록하기 위해 코드를 작성해야 할 것이다. 이 메커니즘이 당신에게 무엇을 해주기를 원합니까? –

+0

우리는 (Enterprise Library blocks) EL 5.와 같은 예외 블록을 찾고 있습니다. 우리는 MVC 및 다른 데이터 영역에서 EntityFramework를 사용할 것입니다. 저는 EL이 우리에게 너무 복잡 할 수 있다고 생각합니다. ELMAH를 사용하면 Windows 서비스 예외를 받아들이는 것이 더 좋은 방법 일 것입니다. 사용자 지정 예외가 발생하지만 모든 재배치 및 보안 제거는 우리 프로젝트에 필요한 것 이상입니다. 나를 잘못 이해하지 않는 것은 매우 큽니다. 자체 데이터 센터 및 서비스 위치 지정자가있는 각각 10 개의 서비스 모듈이 포함됩니다. –

+1

다시 말하자면, 실제로이 예외 처리 메커니즘을 원하십니까? 어떤 유스 케이스를 만족 시키려고합니까? 그냥 "내 예외를 기록 하시겠습니까?", 또는 중앙 집중식 예외 차폐, 포장, 변환 등이 필요합니까? –

답변

1

log4net을 사용하십시오. 보다 강력하게 만들려면 예외, 오류 또는 메시지를 데이터베이스에 기록하는 또 다른 WCF 서비스를 만들어야합니다.

단계입니다.

1 - 클라이언트 응용 프로그램의 web.config /의 app.config

<configuration> 
    <configSections> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> 
    </configSections> 
</configuration> 

이 수정 - 아래 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 사람이 적다. 그러나 이것은 우리가 고려하고있는 것이었다. 확실히 이것을 심각하게 고려하여 최소한 이것을 테스트 할 테스트 프로젝트를 만듭니다. 이것은 로거이지만 예외 처리기 또는 이벤트 리스너는 아닙니다. 그러나 자세한 설명에 감사드립니다. :) –

관련 문제