2012-05-28 4 views
1

최종 사용자가 클래스별로 로깅을 활성화/비활성화 할 수있는 GUI를 제공하는 로깅 라이브러리가 있습니다. 이를 통해 지원 담당자는 로그에 범람하지 않고 문제를 해결하는 데 관심있는 클래스에 대한 최종 사용자 로그인을 허용 할 수 있습니다 (이 점에 대해서는 조금 더 있지만이 질문의 목적을 위해서는 충분해야합니다) . GUI는 로깅 라이브러리를 사용하는 모든 클래스를 나열해야합니다..Net 라이브러리는 런타임에 호출 클래스를 식별 할 수 있습니까?

과거에 (Win32 응용 프로그램에서) 사용한 방법은 라이브러리 사용자가 라이브러리를 사용하는 클래스를 나열하기 위해 호출하는 레지스터 함수를 제공하는 것이 었습니다. 이것은 효과가 있지만 고통스럽고 오류가 발생하기 쉽습니다. .NET에서 지금 일하고있는 것을 감안할 때 런타임에 직접 이러한 클래스 목록을 얻을 수 있으므로 등록하지 않아도 GUI를 채울 수 있기를 바랍니다.

이 방법이 있습니까?

+3

'Assembly.GetTypes' 메소드를 사용할 수 있습니까? http://msdn.microsoft.com/en-us/library/system.reflection.assembly.gettypes.aspx 사용자가 기록해야한다는 것을 나타내는 특성을 가진 클래스를 장식 할 수 있습니까? 나는 당신의 디자인이 클래스들 사이를 구별하는 것이 무엇인지 모르겠다. –

+3

로그를 검사하고 로그 메시지를 방출 한 클래스의 개별 목록을 추출하는 것이 더 좋지 않을까요? 로깅 프레임 워크 자체가 특정 클래스에 대한 로그 메시지를 식별하고 중지해야하는지 아니면 프런트 엔드가 필터 만 적용해야합니까? – MattDavey

+0

@MattDavey는 내가 선호하는 것이 무엇인지에 동의한다. 훨씬 간단하다는 점을 제외하면, 적어도 거기에는 문제가있을 것이고, 다시 일어날 때까지 기다릴 필요가 없을 것이다. 그러나 Chris Sinclair와 같이해야한다면, loggable을 만들기 위해 속성을 사용하고 어떤 loggable 물건이 기록되었는지 확인하는 설정 파일을 사용합니다. –

답변

0

당신은 새로운 StackTrace (이것은 단지 예외가보고되지 않습니다)하지만 매우 빠른 아니지만 ...

+3

속도가 느릴뿐만 아니라 최적화 된 릴리스 환경에서 신뢰할 수 없습니다. –

+0

@ AvnerShahar-Kashtan : 왜 신뢰할 수 없습니까? 예, 줄 번호와 매개 변수 이름이 변경 될 수 있습니다. 예 자체 어셈블리의 일부 메소드는 인라인 될 수 있지만 외부 소스에서 호출되는 메소드는 스택 정보에서 호출자를 가져올 수 있습니다. – Ian

+0

그게 전부입니다. 나는'StackTrace'를 얻고 * x * 프레임을 호출하여 누가 그것을 호출했는지를 알 수있는 코드를 보았습니다. 인라이닝과 최적화를 고려하지 않았습니다. –

0

예는 reflection을 사용할 수 있습니다 만들 수 있습니다. 다음 코드는 현재로드 된 모든 클래스 (및 구조체)를 나열하려면 다음

foreach(Assembly asm in AppDomain.CurrentDomain.GetAssemblies() 
    foreach(Type type in asm.GetTypes()){ 

    } 
} 

AppDomain.CurrentDomain.GetAssemblies()가 조립 contiains 그 클래스와 구조체를 모두 나열 할 수 GetTypes()를 사용하여 다음 응용 프로그램 도메인에로드 된 어셈블리를 모두 나열하고 있습니다.

0

4.5 - 간단합니다. 필요한 정보를 매개 변수로 호출 된 메서드에 추가하고 주석을 달고 나머지는 컴파일러에서 처리합니다.

http://www.wintellect.com/cs/blogs/jgarland/archive/2012/03/05/using-the-new-callerinfo-attributes-for-reliable-property-change-notifications.aspx 자세한 정보가 있습니다.

은 다음과 같다 : 개인 무효가 ([CallerMemberName] 문자열 호출자 = NULL)

안타깝게도 없음 클래스 이름 OnPropertyChanged를, 또한 운) SO.

그렇지 않으면 - 빠른 안정적인 방법, 미안.

클래스 별 로깅을 활성화/비활성화 할 수 있습니다.

내가하는 일은 클래스 (Logger) 용 일반 로거입니다. 이 오류는 열려 있지만 다른 클래스 (예 : 도우미 메소드의 경우)를 수동으로 기록 할 수 있습니다. 그것이 얻는만큼 좋고 QUITE 표준 (nlog는 비슷한 메커니즘을 가짐).

1

로깅 할 때 각 클래스는 해당 유형에 대한 로거의 정적 인스턴스를 만듭니다. 이 방법을 통해 각 인스턴스가 생성 될 때이를 추적하고 사용자가 필요에 따라 로그를 비활성화 할 수 있습니다.

private static readonly ILog LOG = LogManager.GetLog(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 

그러나이 자연스럽게 클래스의 정적 멤버가로드 될 때까지 (I 클래스/유형이 처음 액세스 할 때 생각) 발사 그래서 나는 당신이 전체를 볼 수 없습니다 그럴듯의 생각되지 않습니다 모든 클래스가 액세스 될 때까지 로그하려는 클래스의 목록입니다.

관련 문제