2008-09-29 6 views
73

C++에서 C#으로 코딩 할 때 스위치가 변경됩니다. 내 C++ 오류 로깅 /보고 매크로 시스템을 C#과 비슷한 것으로 대체해야합니다. 내 C++ 소스에서C#으로 로그인 할 때 오류가 발생했습니다.

나는

LOGERR ("일부 오류")을 쓸 수 있습니다; 또는 LOGERR ("입력 오류 % s 및 % d", stringvar, intvar);

라이브러리 코드를 지원하는 & 매크로는 소스 파일, 소스 라인, 사용자 이름 및 시간과 함께 (아마도 varargs) 형식화 된 메시지를 데이터베이스에 전달합니다. 동일한 데이터는 나중에 사용자에게보고하기 위해 데이터 구조에 채워집니다.

누구나 C# 코드 조각이나이 기본 오류보고/기록 작업을 수행하는 예제에 대한 포인터가 있습니까?

편집 :이 질문에 나는 .NET에 정말 익숙하지 않았고 System.Diagnostics.Trace를 인식하지 못했습니다. System.Diagnostics.Trace는 내가 그 때 필요로하는 것이었다. 그 이후 로깅 요구 사항이 더 크고 복잡한 프로젝트에서 log4net을 사용했습니다. 그냥 500 라인의 XML 설정 파일을 편집하면 log4net이 필요한 모든 것을 처리 할 것입니다.

답변

72

많이 그래서 나는이 무시됩니다 확신 해요,하지만 난 내 자신의 취향을 추가 할 것입니다 :

System.Diagnostics.Trace 

이것은 당신의 Trace() 방법을 수신 한 다음에 쓰기 청취자를 포함 로그 파일/출력 창/이벤트 로그에 포함 된 프레임 워크의 항목은 DefaultTraceListener, TextWriterTraceListenerEventLogTraceListener입니다. 레벨 (경고, 오류, 정보) 및 범주를 지정할 수 있습니다. 로깅에 대한 열고 System.Diagnostics 방법의 사용에 realting 코멘트 부부에 추가 Writing to the Event Log in a Web Application
UdpTraceListener - write log4net compatible XML messages to a log viewer such as log2console

+20

+1 TRACE 전처리 기 기호로 컴파일 한 경우에만 작은 추가, 추적이 활성화됩니다. – user7116

+1

TextWriterTraceListener에 주목해야 할 것은 타임 스탬프를 사용하지 않는다는 것입니다. –

+6

'TextWriterTraceListener'에서'WriteLine()'메소드를 오버라이드하여 로그 파일에서 자동 타임 스탬핑 기능을 구현할 수 있습니다. [this CodeProject article] (http://www.codeproject.com/KB/dotnet/customnettracelisteners.aspx), 섹션 6을 참조하십시오. –

5

개인적으로는 싫지만 log4net은 C# 로깅의 사실상 표준 인 것 같습니다. 샘플 사용 :

log4net.ILog log = log4net.LogManager.GetLogger(typeof(Program)); 
log.Error(“Some error”); 
log.ErrorFormat("Error with inputs {0} and {1}", stringvar, intvar); 
+1

log4Net의 문제점은 무엇입니까? –

+12

그것은 일을 끝내지 만, 나는 문서를 싫어하고 내가 원하는 방식으로 비교적 간단한 일을 할 수있게 될 때까지 설정 파일을 수정하고 기본적으로 블라인드 비행을하는 데 많은 시간을 보낸 것에 대해 분개 스럽다. –

+4

나는 log4net을 사용했고, 그것을 (그리고 NHibernate와 다른 사람들이 사용하는) 강력한 도구임을 고맙게 생각한다. 하지만 사람들이 .NET 2.0 inbuilt 추적을 사용하는 것을 좋아하지 않는 이유가 궁금합니다. 다른 유형의 리스너와 몇 가지 도구를 사용하면 java4 포트 인 log4net보다 덜 혼란스러워 보입니다. –

40

나는 매우 log4Net을 보길 권합니다. 이 post은 시작하는 데 필요한 대부분의 정보를 제공합니다.

+0

"각 클래스의 시작 부분에 다음과 같이 로거 인스턴스를 선언하십시오 ..."당신은 나를 거기에서 잃어 버렸습니다. :-) – Kos

3

Log4Net는 다른 수준 (디버그, 오류, 치명적인) 및 출력 5 월 다른 곳으로 이러한 로그 문 (압연 파일, 웹 서비스를 윈도우 오류)

에 로그인 할 수 있도록하는 대신 포괄적 인 로깅 프레임 워크입니다 로거의 인스턴스를 만들어 어디서나 쉽게 로그 할 수 있습니다.

private static readonly ILog _log = LogManager.GetLogger(typeof([Class Name])); 

그런 다음 오류를 기록합니다.

_log.Error("Error messsage", ex); 
11

Enterprise Librarylog4net에 고체 대안과는 다른 기능의 무리 (캐싱, 예외 처리, 검증, 등 ...) 제공합니다. 내가 만든 모든 프로젝트에서 사용합니다.

적극 권장합니다.

+1

EL은 로깅의 일부로 전자 메일을 보낼 수도 있습니다. 오류를보고 할 때 매우 편리합니다. – StingyJack

1

log4net의 경우에도 마찬가지입니다. 실제 사용을 위해 일부 오픈 소스 구현을 살펴보면 실제 코드 샘플을 손쉽게 추가 할 수 있기 때문에이 두 비트를 추가하고 있습니다. log4net 들어, 내 머리의 상단에서 subtext 찾고 제안거야. 특히 응용 프로그램 시작 및 assemblyinfo 비트를 살펴보십시오.

15

다른 좋은 로깅 라이브러리는 파일, 데이터베이스, 이벤트 로거 등과 같이 많은 장소에 로그 할 수있는 NLog입니다.여기 log4net 지지자의

+1

NLog는 아주 좋은 로거이며 사용하기 쉽습니다. – meffordm

1

Trace class on MSDN
, 나는 또한 DebugView 도구 점검을위한 매우 깔끔한 것을 지적하고 싶습니다 필요한 경우 디버그 출력 - 필요하지 않으면 응용 프로그램에서 로그 파일을 생성 할 필요가 없으며 필요한 경우 DebugView를 시작하기 만하면됩니다.

2

당신은 .NET 로깅에 내장 사용할 수있는 로깅을 사용할 수있는 옵션이 있습니다. TraceSource 및 TraceListeners를 보면 .config 파일에서 구성 할 수 있습니다.

14

나는 그것을 사용하는 대부분의 사람들과 마찬가지로 The Object Guy's Logging Framework을 사용합니다. 이 사람은 그것에 대해 흥미있는 약간의 comments을 가지고있다.

5

다른 스레드에서 말했듯이 우리는 수년 동안 여러 제작 응용 프로그램에서 The Object Guy's Logging Framework을 사용 해왔다. 사용하기 쉽고 확장하기 쉽습니다.

1

System.Diagnostics의 기본 제공 추적 기능은 .NET Framework에서 잘 작동하며 많은 응용 프로그램에서 사용합니다. 그러나 여전히 log4net을 사용하는 주된 이유 중 하나는 .NET Framework 추적 기능에 내장 된 log4net이 제공하는 유용한 전체 기능의 appenders가 부족하다는 것입니다.

예를 들어 실제로는 롤링 파일이 좋지 않습니다. .NET Framework에서 정의 된 추적 수신기는 VB.NET dll에있는 것 이외의 모든 기능을 제공합니다.

개발 환경에 따라 타사 도구를 사용할 수 없다면 log4net을 사용하는 것이 좋습니다. 그렇다면 System.Diagnostics 추적 클래스를 사용하는 것이 좋습니다. 더 나은 appender/tracelistener가 필요하다면, 직접 구현할 수 있습니다.

예를 들어 많은 고객은 회사 컴퓨터에 설치된 오픈 소스 라이브러리를 사용하지 않아야하므로 .NET Framework 추적 클래스가 가장 적합합니다.

또한 - http://www.postsharp.org/은 코드 프로젝트에서 여기에 설명 된대로 로깅을 도울 수있는 AOP 라이브러리입니다 (http://www.codeproject.com/KB/dotnet/log4postsharp-intro.aspx).

3

Serilog은 파티에 늦었지만 테이블에 흥미로운 옵션을 제공합니다.그것은 사용하기 매우 고전적인 텍스트 기반 로거 다음과 같습니다

Log.Information("Hello, {0}", username); 

을하지만, 예를 들어, 텍스트를 작성할 때, 이전 프레임 워크와는 달리, 그것은 단지 문자열로 메시지 및 인수를 렌더링 파일이나 콘솔에 저장합니다.

아이디어는 당신이 로그에 대한 'NoSQL' 스타일의 데이터 저장소를 사용하는 경우, 당신은 같은 이벤트를 기록 할 수 있다는 것입니다 :

당신이 쓸 수 있도록 .NET 형식 문자열 구문이 확장
{ 
    Timestamp: "2014-02-....", 
    Message: "Hello, nblumhardt", 
    Properties: 
    { 
     "0": "nblumhardt" 
    } 
} 

위의 예로서이 경우

Log.Information("Hello, {Name}", username); 

속성이 질의 쉽게 상관 관계를 만들고, (오히려 0보다) Name를 호출됩니다.

이미 몇 가지 저장 옵션이 있습니다. MongoDB와 Azure Table Storage는 DIY에서 꽤 인기가있는 것 같습니다. 원래 Serilog를 만들었지 만 (커뮤니티 프로젝트이지만) Seq이라는 제품에 대한 작업을하고 있습니다.이 제품은 이러한 종류의 구조화 된 로그 이벤트를 저장하고 쿼리합니다.

1

ExceptionLess은 로깅에 사용할 수있는 가장 쉬운 누겟 패키지 중 하나입니다. 그것의 open source 프로젝트. 처리되지 않은 예외를 자동으로 처리하고 manually logs의 옵션을 사용할 수 있습니다. 로컬 서버의 온라인 또는 self host에 로그인 할 수 있습니다.

+1

나는 Exceptionless 프로젝트를 작업하며 어떤 질문에도 기꺼이 답할 것입니다. Exceptionless (무료 로그 메시지 + 처리되지 않은 예외)를 사용하여 즉시 값을 많이 얻을 수 있도록 모든 주요 로깅 프레임 워크에 대해 로깅 대상을 로깅합니다. –