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 서비스를 설정했습니다.
희망이 있으면 도움이 될 것입니다.
"예외 처리 메커니즘"을 정의 할 수 있습니까? 아래에 언급 된 ELMAH 및 log4net은 예외 처리가 아닌 로깅 솔루션입니다. 당신은 여전히 예외를 잡아서 기록하기 위해 코드를 작성해야 할 것이다. 이 메커니즘이 당신에게 무엇을 해주기를 원합니까? –
우리는 (Enterprise Library blocks) EL 5.와 같은 예외 블록을 찾고 있습니다. 우리는 MVC 및 다른 데이터 영역에서 EntityFramework를 사용할 것입니다. 저는 EL이 우리에게 너무 복잡 할 수 있다고 생각합니다. ELMAH를 사용하면 Windows 서비스 예외를 받아들이는 것이 더 좋은 방법 일 것입니다. 사용자 지정 예외가 발생하지만 모든 재배치 및 보안 제거는 우리 프로젝트에 필요한 것 이상입니다. 나를 잘못 이해하지 않는 것은 매우 큽니다. 자체 데이터 센터 및 서비스 위치 지정자가있는 각각 10 개의 서비스 모듈이 포함됩니다. –
다시 말하자면, 실제로이 예외 처리 메커니즘을 원하십니까? 어떤 유스 케이스를 만족 시키려고합니까? 그냥 "내 예외를 기록 하시겠습니까?", 또는 중앙 집중식 예외 차폐, 포장, 변환 등이 필요합니까? –