2012-01-05 3 views
1

내 응용 프로그램에 대한 로그 도구가 있습니다. 계층 적 방식으로 XML에 로그합니다 (즉, 로그 항목을 중첩 할 수 있음을 의미합니다). 내 Log(string, bool)은 두 개의 매개 변수를 취합니다. 하나는 로그 할 문자열과이 코멘트가 이전 로그 주석 아래에 중첩되어야 하는지를 결정하는 bool 값입니다. PopLog() 메서드는 부모로 이동하여 상위 수준에서 계속 로깅됩니다.내 로그 클래스를 개선하는 방법

Log("first", false); 
... 
Log("Second", true); 
... 
Log("Third", true); 
PopLog(); 
PopLog(); 
PopLog(); 

이것은 다음과 같은 결과를 제공합니다 :

내가 같이 로그인 할 때 것을 의미

<first> 
    <second> 
    <third> 
    </second> 
</first> 

내가 현재의 디자인이 문제는 추적하기 어려운 내 로그 수준, 로깅 트리에 얼마나 깊이있게 있는지, 팝업을 할 것인지, true를 사용하여 기록 할 것인지 또는 false를 사용하여 기록 할 것인지를 결정해야합니다.

이 방법을 더 간단하고 유지 보수가 잘되고 (로그 공급자를 변경하는 옵션이 아님) 좋은 아이디어가 있습니까?

+3

당신이 log4net 또는 log4j를 사용하지 않는 이유는 무엇입니까? –

답변

0

IMO가 푸시/팝 동작을 로깅 자체와 분리하는 것이 더 좋습니다. 여기에 IDisposable를 사용하여 C#에서 해결책 :

class IndentedLog : IDisposable 
{ 
    public IndentedLog() 
    { 
     Log.IndentLevel++; 
    } 
    public void Dispose() 
    { 
     Log.IndentLevel--; 
    } 
} 

이 방법을 사용하면 같은 수행 할 수 있습니다

 Log("first"); 
    // ... 
    using (new IndentedLog()) 
    { 
     Log("second"); 
     // ... 
     using (new IndentedLog()) 
     { 
      Log("third"); 
     } 
    } 
2

가독성을 위해 을 추가하겠다., 어린이는 AddLog()과 유사 할 가능성이있다. 포어 예 :

Log("first").Log("second").Log("third")

이것은 기본적으로 log()content log 유형을 반환해야 함을 의미한다.

희망은 분명했지만 모바일에서 작성하여 구체적인 코드 예제를 작성하는 것은 엉망이지만 힌트를 제공하기 만하면됩니다.

Log("first", "/first"); 
Log("Second", "/first/second"); 
0

은 아마 당신은 부울 값 대신 XPath 식을 추가 할 수 있습니다. 그렇지 않으면 실행 마지막에 열려있는 모든 태그를 닫는 CloseAllTags()을 호출해야합니다. 열려있는 태그가없는 경우 PopLog()은 아무 것도 수행하지 않아야합니다. 이렇게하면 중첩 수준을 확인할 필요가 없습니다.

0

내가 PopLog()은 선택하고 당신이 한 단계 위로 이동하는 데 필요한 알고있는 경우에만 호출합니다라고 말하고 싶지만

0

로그 클래스에서 다음과 같은 3 가지 속성을 가질 수 있습니다. 1. ID는 모든 인스턴스에 고유합니다. 2. Level은 로그의 깊이를 나타내는 int 유형입니다. 3. 부모, 그것은 XML의 한 수준 위에있는 로그의 ID입니다.

그런 다음 로그가있는 위치와 위 속성을 사용하는 방법을 식별 할 수있는 방법을 작성할 수 있습니다.

관련 문제