2010-07-29 4 views
5

현재 프로젝트에서 우리는 로깅을 위해 엔터프라이즈 라이브러리를 사용하기로 결정했습니다. 이제는 log4net 만 사용했지만 실제로 라이브러리를 유연한 방법으로 사용하는 방법을 찾을 수 없습니다. log4net에서이 방법이있을 것입니다 :엔터 프라이즈 라이브러리를 사용하여 로깅을위한 패턴

//define this in MyClass 
private static readonly ILog log = LogManager.GetLogger(typeof(MyClass)); 
//and than in the methods you can call it like this 
log.Info("info message"); 

이 나중에 응용 프로그램에 내가 정보를 돌 수 있었다 구성을 chainging으로 갈 날 수 있도록 것입니다/응용 프로그램을 건드리지 않고 특정 클래스에 대한 levelels을 경고한다.

로깅 라이브러리의 유일한 샘플은 기본적으로 이것이다 : 내가 오타 및 이와 유사한 일부 문자열을 기반으로 필터링을 준수 할 것이며, 모든 개발자가 자신의 카테고리에 토큰을 도입하는 것보다

LogEntry logEntry = new LogEntry(); 
logEntry.EventId = 100; 
logEntry.Priority = 2; 
logEntry.Message = "Informational message"; 
logEntry.Categories.Add("Trace"); 
logEntry.Categories.Add("UI Events"); 
Logger.Write(logEntry); 

하지만, 무엇이다 이를 제한하는 가장 좋은 방법은 메시지를 구성하는 가장 좋은 방법은 솔루션 위의 다른 쪽에서는 단일 로그 메시지에 대해 10 줄을 요구하는 개발자가 아니기 때문에 전체 솔루션에 대한 일부 정적 메서드를 사용하면 필터링의 유연성이 떨어질 수 있습니다. 로깅을 사용하는 가장 좋은 방법은?
의미있는 패턴을 사용하는 방법을 찾았습니까?

감사 알미르

답변

4

귀하의 질문의 접촉을 내 프로필을 참조하십시오. 물론, 그냥 (일부 구성 두통과 함께) 작동하지만, 만약 당신이 거기에 없어 구조의 비트와 함께 뭔가를 원한다. 거기에는 Microsoft로부터 많은 지침이 없습니다.

는 여기에 내가 무엇을 할 것이라고입니다 :

  • 나는 당신이 당신의 데이터를 기록 할 방법 제어 할 수 있습니다 로깅 블록에 외관을 추가합니다. 즉, 개발자가 자신의 카테고리를 만들지 않길 원할 경우, Facade에 열거 형을 지정하십시오 (여러 카테고리를 허용하는 플래그로 표시 할 수 있음).

  • 나는 당신도 심각도와 범주가 필터링을 고려할 때 매우 구입한다고 생각하지 않기 때문에 Priority를 ​​제거 할 것입니다.

  • (유효성 검사 응용 프로그램 차단을 사용하는 경우) 예외 및 유효성 검사 결과를 지원하기 위해 오버로드를 추가 할 수도 있습니다.

  • 특정 클래스에 대한 로깅을 지원하는 카테고리로 클래스 이름을 추가하는 것이 좋습니다. 개발자는 클래스 이름을 전달할 수도 있고 리플렉션을 통해 확인할 수도 있습니다. 나는 그것을 선호합니다

을 그래서 당신은 같은 것을 할 수있는 :. 그 후 여전히 너무 많은 인수의 경우

public class MyClass 
{ 
    private static readonly string ClassName = typeof(MyClass).FullName; 

    public void DoSomething() 
    { 
     MyLogger.LogMessage("I'm going to DoSomething now!", 
      ClassName, 
      1001, 
      EventDataTypeCategory.Trace | EventDataTypeCategory.UIEvents); 
    } 
} 

을 :

[Flags] 
public enum EventDataTypeCategory 
{  
    None = 0x0, 
    Failure = 0x1, 
    Error = 0x2 , 
    Warning = 0x4, 
    Information = 0x8, 
    Debug = 0x10, 
    Trace = 0x20, 
    UIEvents = 0x40, 
    DataAccess = 0x80 
} 

public static void LogMessage(string message, string className, int eventId, 
    EventDataTypeCategory categories) 
{ 
    // Create LogEntry 
    LogEntry logEntry = new LogEntry(...); 

    // Add all categories 
    foreach (EventDataTypeCategory enumValue in System.Enum.GetValues(typeof(EventDataTypeCategory))) 
    { 
     if ((enumValue & categories) == enumValue) 
     { 
      logEntry.Categories.Add(enumValue.ToString()); 
     } 
    } 

    if (className != null) 
    { 
     logEntry.Categories.Add(className); 
    } 

    ... 

    Logger.Write(logEntry); 
} 

그런 다음 당신은 다음과 같이 호출 수를 매개 변수가 적고 다른 값에 대한 기본값을 제공하는 오버로드를 가질 수 있습니다. 예 : EventIDs에 신경 쓰지 않는다면 기본값은 0입니다.

0

별로 귀하의 질문에 대답,하지만 난 내 자신의 로깅 시스템을 만들기까지했다.

당신이해야 할 유일한 것은은 다음과 같습니다

Log.Instance.AddFormat("My favourite number is {0}", 42); 

또는

Log.Instance.Add("This is an important message", LogLevel.Critical); 
:
Log.Instance.Add("This is a message"); 

모든 다른 더 복잡한 용도

예를 들어, 다른 방법을 통해 또는 과부하로 완료

모든 정직한면에서 나는 여전히 Lo의 모든 과충전이 발생하는 경우가 발생합니다. g4Net 및 Enterprise 로깅은 실제로 필요하거나 바람직합니다.

은 자세한 내용은 엔터프라이즈 라이브러리의 "문제"중 하나 (가 SixPack library의 일부)

관련 문제