programing

로깅 모범 사례

lovejava 2023. 4. 29. 08:09

로깅 모범 사례

저는 사람들이 실제 응용 프로그램에서 추적 및 로그인을 어떻게 처리하는지에 대한 이야기를 얻고 싶습니다.다음은 답변을 설명하는 데 도움이 될 수 있는 몇 가지 질문입니다.

프레임워크

어떤 프레임워크를 사용하십니까?

  • log4net
  • 시스템. 진단.추적하다
  • 시스템. 진단.추적 소스
  • 로깅 응용 프로그램 블록
  • 다른?

추적을 사용하는 경우 추적을 사용합니까?상관 관계.논리적 작업을 시작하시겠습니까?

이 코드를 수동으로 작성합니까, 아니면 어떤 형태의 측면 지향 프로그래밍을 사용합니까?코드 조각을 공유하시겠습니까?

추적 소스에 대한 세분화를 제공합니까?예를 들어 WPF TraceSources를 사용하면 다양한 수준에서 구성할 수 있습니다.

  • System.Windows - 모든 WPF에 대한 설정
  • 시스템. 윈도우.애니메이션 - 애니메이션에 대해 재정의합니다.

청취자

어떤 로그 출력을 사용합니까?

  • 텍스트 파일
  • XML 파일
  • 이벤트 로그
  • 다른?

파일을 사용하는 경우 롤링 로그를 사용합니까, 아니면 단일 파일을 사용합니까?로그를 사용자가 사용할 수 있도록 하려면 어떻게 해야 합니까?

보기

로그를 보는 데 사용할 도구는 무엇입니까?

  • 메모장
  • 꼬리
  • 이벤트 뷰어
  • 시스템 센터 운영 관리자/마이크로소프트 운영 관리자
  • WCF 서비스 추적 뷰어
  • 다른?

ASP를 구축하는 경우.NET 솔루션, ASP도 사용하십니까?NET 상태 모니터링?상태 모니터 이벤트에 추적 출력을 포함합니까?Trace.axd는?

사용자 지정 성능 카운터는 어떻습니까?


업데이트: 시스템 확장용입니다.누락된 수신기를 제공하는 진단은 필수 항목을 참조하십시오.CodePlex에 대한 진단(http://essentialdiagnostics.codeplex.com/)


프레임워크

Q: 어떤 프레임워크를 사용하십니까?

A: 시스템.진단.TraceSource, 에 내장되어 있습니다.NET 2.0.

애플리케이션에 강력하고 유연한 고성능 로깅을 제공하지만, 많은 개발자가 이 기능을 제대로 인식하지 못하고 활용하지 못하고 있습니다.

추가 기능이 유용하거나 때로는 기능이 존재하지만 잘 문서화되지 않은 영역도 있지만, 이는 일부 일반적인 대안(NLog, log4net, Common)처럼 전체 로깅 프레임워크(확장 가능하도록 설계됨)를 버리고 완전히 교체해야 한다는 것을 의미하지는 않습니다.로깅 및 EntLib 로깅).

응용 프로그램에 로깅 문을 추가하고 휠을 다시 발명하는 방식을 변경하는 대신 시스템을 확장하면 됩니다.필요한 몇 가지 장소에서 진단 프레임워크를 제공합니다.

제가 보기에 다른 프레임워크, 심지어 EntLib도 단순히 Not Evened Here Syndrome을 앓고 있는 것처럼 보이며, 저는 그들이 이미 System에서 완벽하게 작동하는 기본적인 것들을 다시 발명하는 데 시간을 낭비했다고 생각합니다.진단(예: 로그 문 작성 방법) - 존재하는 몇 개의 공백을 채우는 것이 아니라간단히 말해서, 그것들을 사용하지 마세요. 그것들은 필요하지 않습니다.

몰랐던 기능:

  • 형식 문자열과 인수를 사용하는 TraceEvent 오버로드를 사용하면 필터 이후까지 매개 변수가 별도의 참조로 유지되므로 성능을 향상시킬 수 있습니다.추적()이 성공한 경우.이는 시스템이 메시지를 확인한 후 실제로 기록될 때까지 파라미터 값에 대한 ToString()에 대한 고가의 호출이 없음을 의미합니다.
  • 추적.상관 관계 관리자를 사용하면 동일한 논리적 작업에 대한 로그 문을 상관시킬 수 있습니다(아래 참조).
  • Visual Basic.로깅.FileLogTraceListener는 로그 파일에 쓰기에 적합하며 파일 순환을 지원합니다.VisualBasic 네임스페이스에서는 DLL을 포함하는 것만으로 C#(또는 다른 언어) 프로젝트에서 쉽게 사용할 수 있습니다.
  • EventLogTraceListener를 사용할 때 여러 인수와 빈 형식 또는 null 형식 문자열을 사용하여 TraceEvent를 호출하면 인수가 EventLog로 직접 전달됩니다.현지화된 메시지 리소스를 사용하는 경우 WriteEntry().
  • WCF의 서비스 추적 뷰어 도구는 WCF를 사용하지 않는 경우에도 작업 상관 로그 파일의 그래프를 보는 데 유용합니다.이렇게 하면 여러 스레드/활동이 관련된 복잡한 문제를 디버깅하는 데 도움이 됩니다.
  • 모든 수신기를 삭제하거나 기본값을 제거하여 오버헤드를 방지합니다. 그렇지 않으면 기본값이 모든 것을 추적 시스템에 전달합니다(그리고 모든 ToString() 오버헤드가 발생합니다).

확장을 검토해야 할 영역(필요한 경우):

  • 데이터베이스 추적 수신기
  • 색상이 지정된 콘솔 추적 수신기
  • MSMQ / 이메일 / WMI 추적 수신기(필요한 경우)
  • 추적을 호출하는 FileSystemWatcher를 구현합니다.동적 구성 변경을 위해 새로 고침

기타 권장 사항:

구조화된 이벤트 ID를 사용하고 참조 목록을 유지합니다(예: 열거형으로 문서화).

시스템의 각(중요한) 이벤트에 대해 고유한 이벤트 ID를 갖는 것은 특정 문제를 상호 연결하고 찾는 데 매우 유용합니다.이벤트 ID를 기록/사용하는 특정 코드로 쉽게 추적할 수 있으며, 일반적인 오류(예: 오류 5178은 데이터베이스 연결 문자열이 잘못되었음을 의미함)에 대한 지침을 쉽게 제공할 수 있습니다.

이벤트 ID는 특정 코드를 몰라도 범주별로 처리할 수 있는 일종의 구조(이메일 및 HTTP에서 사용되는 응답 코드 이론과 유사)를 따라야 합니다.

예를 들어, 첫 번째 숫자는 일반 클래스를 자세히 설명할 수 있습니다. 1xxx는 '시작' 작업에 사용할 수 있고, 2xxx는 정상 동작에 사용할 수 있으며, 3xxx는 활동 추적에 사용할 수 있으며, 4xxx는 경고에 사용할 수 있고, 5xxxx는 오류에 사용할 수 있으며, 8xxxxxxxx는 '중지' 작업에 사용할 수 있습니다.

두 번째 숫자는 데이터베이스 정보의 경우 21xx(데이터베이스 경고의 경우 41xx, 데이터베이스 오류의 경우 51xx), 계산 모드의 경우 22xx(계산 경고의 경우 42xx 등), 다른 모듈의 경우 23xx 등의 영역을 자세히 설명할 수 있습니다.

할당된 구조화된 이벤트 ID를 사용하여 필터에서도 사용할 수 있습니다.

Q: 추적을 사용하는 경우 추적을 사용합니까?상관 관계.논리적 작업을 시작하시겠습니까?

A: 흔적.상관 관계 관리자는 모든 종류의 멀티 스레드 환경(요즘은 거의 모든 환경)에서 로그 문을 상호 연결하는 데 매우 유용합니다.

상관 관계를 설정하려면 각 논리적 작업에 대해 ActivityId를 한 번 이상 설정해야 합니다.

Start/Stop 및 Logical OperationStack은 단순한 스택 기반 컨텍스트에 사용할 수 있습니다.좀 더 복잡한 컨텍스트(예: 비동기 작업)의 경우 새 ActivityId로 TraceTransfer를 사용하면(변경하기 전에) 상관 관계를 확인할 수 있습니다.

서비스 추적 뷰어 도구는 WCF를 사용하지 않는 경우에도 활동 그래프를 보는 데 유용할 수 있습니다.

Q: 이 코드를 수동으로 작성합니까, 아니면 어떤 형태의 측면 지향 프로그래밍을 사용합니까?코드 조각을 공유하시겠습니까?

A: (a) 생성 시 컨텍스트를 설정하고 (b) 폐기 시 컨텍스트를 재설정하는 Logical Operation Scope와 같은 스코프 클래스를 생성할 수 있습니다.

이렇게 하면 다음과 같은 코드를 작성하여 작업을 자동으로 래핑할 수 있습니다.

  using( LogicalOperationScope operation = new LogicalOperationScope("Operation") )
  {
    // .. do work here
  }

생성 시 스코프는 필요한 경우 먼저 ActivityId를 설정하고 StartLogicalOperation을 호출한 다음 TraceEventType을 기록할 수 있습니다.메시지 시작.폐기 시 중지 메시지를 기록한 다음 논리적 작업 중지를 호출할 수 있습니다.

Q: 추적 소스에 대한 세분화를 제공합니까?예: WPF 추적 소스를 사용하여 다양한 수준에서 구성할 수 있습니다.

A: 예, 시스템이 커질수록 여러 추적 소스가 유용하고 중요합니다.

적절한 크기의 시스템에 대해 모든 경고 & 위 또는 모든 정보 & 위 메시지를 일관되게 기록하고 싶지만 활동 추적(시작, 중지 등) 및 상세 기록의 양이 너무 많아집니다.

모든 스위치를 켜거나 끄는 스위치가 하나만 있는 것이 아니라 시스템의 한 섹션에 대해 이 정보를 한 번에 켤 수 있는 것이 유용합니다.

이렇게 하면 일반적으로 로깅(모든 경고, 오류 등)에서 중요한 문제를 찾은 다음 원하는 섹션을 "확대"하여 활동 추적 또는 디버그 수준으로 설정할 수 있습니다.

필요한 추적 소스의 수는 응용 프로그램에 따라 다릅니다. 예를 들어 어셈블리 또는 응용 프로그램의 주요 섹션당 하나의 추적 소스를 원할 수 있습니다.

더 미세하게 조정된 제어가 필요한 경우 개별 부울 스위치를 추가하여 원시 메시지 덤프와 같은 특정 대용량 추적을 켜거나 끌 수 있습니다(또는 별도의 추적 소스를 WCF/WPF와 유사하게 사용할 수도 있습니다).

또한 필터를 원하는 방식으로 정확하게 구성하는 것이 조금 더 쉬워질 수 있으므로 활동 추적 대 일반(기타) 로깅에 대해 별도의 추적 소스를 고려할 수 있습니다.

다른 소스를 사용하더라도 ActivityId를 통해 메시지를 상관시킬 수 있으므로 필요한 만큼 사용하십시오.


청취자

Q: 어떤 로그 출력을 사용하십니까?

이는 작성 중인 응용 프로그램 유형과 기록되는 항목에 따라 달라질 수 있습니다.일반적으로 서로 다른 위치(즉, 여러 출력)에 배치됩니다.

저는 일반적으로 출력을 세 그룹으로 분류합니다.

이벤트 - Windows 이벤트 로그(및 추적 파일)

예를 들어 서버/서비스를 작성하는 경우 Windows에서 가장 좋은 방법은 Windows 이벤트 로그를 사용하는 것입니다(보고할 UI가 없음).

이 경우 모든 Fatal, Error, Warning 및 (서비스 수준) Information 이벤트는 Windows 이벤트 로그로 이동해야 합니다.정보 수준은 이벤트 로그에 기록할 이벤트(예: "서비스 시작됨", "서비스 중지됨", "Xyz에 연결됨" 및 "예약 시작됨", "사용자 로그온" 등) 유형에 대해 예약해야 합니다.

경우에 따라 추적 시스템을 통해가 아닌 응용 프로그램의 기본 제공 부분으로 이벤트 로그에 기록하기를 원할 수 있습니다(즉, 이벤트 로그 항목을 직접 기록).이는 실수로 꺼질 수 없음을 의미합니다. (또한 상관 관계를 확인할 수 있도록 추적 시스템에서 동일한 이벤트를 기록하려고 합니다.

이와 대조적으로 Windows GUI 응용 프로그램은 일반적으로 사용자에게 이러한 내용을 보고합니다(Windows 이벤트 로그에 기록할 수도 있음).

이벤트에는 관련 성능 카운터(예: 초당 오류 수)가 있을 수도 있으며, 이벤트 로그에 직접 기록, 성능 카운터, 추적 시스템에 기록 및 사용자에게 보고하는 작업을 동시에 수행하도록 조정하는 것이 중요할 수 있습니다.

예: 특정 시간에 오류 메시지가 표시되면 Windows 이벤트 로그에서 동일한 오류 메시지를 찾은 다음 추적 로그에서 동일한 타임스탬프를 가진 동일한 이벤트(다른 추적 세부 정보와 함께)를 찾을 수 있습니다.

활동 - 응용프로그램 로그 파일 또는 데이터베이스 테이블(및 추적 파일)

이것은 시스템이 수행하는 정기적인 활동입니다. 예를 들어 웹 페이지 제공, 주식 시장 거래, 주문 접수, 계산 수행 등입니다.

활동 추적(시작, 중지 등)은 여기(적절한 세분성)에서 유용합니다.

또한 특정 응용 프로그램 로그(감사 로그라고도 함)를 사용하는 것이 매우 일반적입니다.일반적으로 이것은 데이터베이스 테이블 또는 응용프로그램 로그 파일이며 구조화된 데이터(즉, 필드 집합)를 포함합니다.

응용 프로그램에 따라 여기에 내용이 약간 흐려질 수 있습니다.각 요청을 웹 로그에 기록하는 웹 서버가 좋은 예가 될 수 있습니다. 각 작업이 애플리케이션별 세부 정보와 함께 기록되는 메시징 시스템 또는 계산 시스템이 유사한 예입니다.

그리 좋은 예는 주식 시장 거래나 판매 주문 시스템입니다.이러한 시스템에서는 중요한 비즈니스 가치가 있기 때문에 이미 활동을 기록하고 있을 수 있지만, 이를 다른 작업과 연관짓는 원칙은 여전히 중요합니다.

사용자 지정 애플리케이션 로그뿐만 아니라 활동에는 종종 초당 트랜잭션 수와 같은 관련 성능 카운터가 있습니다.

일반적으로 서로 다른 시스템에 걸쳐 활동 기록을 조정해야 합니다. 즉, 성능 카운터를 늘리고 추적 시스템에 기록하는 동시에 애플리케이션 로그에 기록해야 합니다.모든 작업을 동시에 수행하는 경우(또는 코드에서 서로 바로 수행하는 경우) 디버깅 문제가 코드에서 서로 다른 시간/위치에서 발생하는 경우보다 더 쉽습니다.

디버그 추적 - 텍스트 파일 또는 XML 또는 데이터베이스일 수 있습니다.

상세 수준 이하의 정보입니다(예: 원시 데이터 덤프를 켜거나 끌 사용자 지정 부울 스위치).이것은 시스템이 하위 활동 수준에서 수행하는 작업에 대한 세부 정보나 배짱을 제공합니다.

응용프로그램의 개별 섹션(즉, 여러 소스)에 대해 설정/해제할 수 있는 수준입니다.Windows 이벤트 로그에 이러한 항목이 혼란스럽게 되는 것을 원하지 않습니다.데이터베이스가 사용되는 경우도 있지만 특정 시간이 지나면 삭제되는 롤링 로그 파일이 사용될 가능성이 높습니다.

이 정보와 응용 프로그램 로그 파일의 큰 차이점은 구조화되지 않았다는 것입니다.응용 프로그램 로그에 To, From, Mount 등의 필드가 있을 수 있지만 자세한 디버그 추적은 프로그래머가 입력하는 모든 것일 수 있습니다. 예를 들어 "X={value}, Y=false" 또는 "Done it, trying again"과 같은 임의의 주석/이벤트입니다.

한 가지 중요한 방법은 응용 프로그램 로그 파일에 저장한 내용이나 Windows 이벤트 로그가 추적 시스템에 동일한 세부 정보(예: 타임스탬프)로 기록되도록 하는 것입니다.그러면 조사할 때 서로 다른 로그를 상관시킬 수 있습니다.

서비스 추적 뷰어와 같이 복잡한 상관 관계가 있기 때문에 특정 로그 뷰어를 사용하려면 적절한 형식(예: XML)을 사용해야 합니다. 그렇지 않으면 일반적으로 간단한 텍스트 파일만 사용하면 됩니다. 낮은 수준에서는 정보가 대부분 구조화되지 않으므로 어레이 덤프, 스택 덤프 등을 찾을 수 있습니다.더 높은 수준의 구조화된 로그와 다시 상관 관계를 맺을 수 있다면 문제가 없을 것입니다.

Q: 파일을 사용하는 경우 롤링 로그를 사용합니까, 아니면 단일 파일을 사용합니까?로그를 사용자가 사용할 수 있도록 하려면 어떻게 해야 합니까?

A: 파일의 경우 일반적으로 관리성 관점에서 로그 파일을 롤링합니다(시스템 사용).진단은 단순히 Visual Basic을 사용합니다.로깅.FileLogTraceListener).

가용성은 시스템에 따라 달라집니다.서버/서비스의 경우 파일만 사용하는 경우 롤링 파일에 필요할 때 액세스할 수 있습니다. (Windows 이벤트 로그 또는 데이터베이스 응용 프로그램 로그에는 고유한 액세스 메커니즘이 있습니다.)

파일 시스템에 쉽게 액세스할 수 없는 경우 데이터베이스에 대한 디버그 추적이 더 쉬울 수 있습니다.[즉, 데이터베이스 TraceListener 구현].

Windows GUI 애플리케이션을 위한 한 가지 흥미로운 해결책은 실행 중에 "비행 기록기"에 매우 상세한 추적 정보를 기록한 다음 문제가 없으면 종료하면 파일이 삭제된다는 것입니다.

그러나 충돌하거나 문제가 발생한 경우에는 파일이 삭제되지 않았습니다.오류가 발견된 경우 또는 다음 번에 실행될 때 파일을 인식하고 압축(예: 7zip)하여 전자 메일로 보내거나 사용할 수 있도록 하는 등의 작업을 수행할 수 있습니다.

오늘날 많은 시스템은 사용자에게 개인 정보 보호 등의 이유로 확인한 후 중앙 서버에 장애를 자동으로 보고합니다.


보기

Q: 로그를 볼 때 어떤 도구를 사용합니까?

A: 여러 가지 이유로 여러 개의 로그가 있는 경우 여러 뷰어를 사용합니다.

메모장/vi/Notepad++ 또는 기타 텍스트 편집기는 일반 텍스트 로그의 기본입니다.

전송 작업과 같은 복잡한 작업이 있는 경우 서비스 추적 뷰어와 같은 특수 도구를 사용할 수 있습니다.

일반적으로 Windows 이벤트 로그에 고급 정보를 기록하기 때문에 구조화된 방식으로 개요를 빠르게 얻을 수 있습니다(예쁜 오류/경고 아이콘).로그에 충분한 양이 없을 경우에만 텍스트 파일을 통해 검색을 시작하면 됩니다. 이 때 로그 전체가 조정되었는지 확인하는 것이 유용합니다.

일반적으로 Windows 이벤트 로그는 MOM 또는 OpenView와 같은 모니터링 도구에서도 이러한 중요한 이벤트를 사용할 수 있도록 합니다.

기타 --

데이터베이스에 로그인하면 정보를 쉽게 필터링하고 정렬할 수 있습니다(예: 특정 활동 ID 확대). (텍스트 파일을 사용하면 Grep/PowerShell 등을 사용하여 원하는 특정 GUID에서 필터링할 수 있습니다.)

MS Excel(또는 다른 스프레드시트 프로그램).이 기능은 올바른 구분 기호를 사용하여 정보를 가져와서 다른 값이 다른 열에 들어가도록 할 수 있는 경우 구조화되거나 반구조화된 정보를 분석하는 데 유용합니다.

디버그/테스트에서 서비스를 실행할 때, 저는 보통 단순성을 위해 콘솔 응용 프로그램에서 서비스를 호스팅합니다(예: 빨간색은 오류, 노란색은 경고 등).사용자 지정 추적 수신기를 구현해야 합니다.

이 프레임워크에는 컬러 콘솔 로거나 데이터베이스 로거가 포함되어 있지 않으므로, 지금은 필요한 경우 이를 작성해야 합니다(너무 어렵지 않습니다).

여러 프레임워크(log4net, EntLib 등)가 휠을 다시 발명하고 텍스트 파일, Windows 이벤트 로그 및 XML 파일에 대한 기본 로깅, 필터링 및 로깅을 각각 다른 방식으로 다시 구현했다는 사실이 정말 짜증납니다(예: 로그 문은 각각 다릅니다).데이터베이스 로거가 이미 존재하고 시스템 추적 수신기가 몇 개 더 필요했을 때.진단.중복 노력의 큰 낭비에 대해 이야기해 보십시오.

Q: ASP를 구축하는 경우.NET 솔루션, ASP도 사용하십니까?NET 상태 모니터링?상태 모니터 이벤트에 추적 출력을 포함합니까?Trace.axd는?

이러한 항목은 필요에 따라 설정/해제할 수 있습니다.트레이스를 찾습니다.axd는 서버가 특정 항목에 응답하는 방식을 디버깅하는 데 매우 유용하지만, 일반적으로 많이 사용되는 환경이나 장기 추적에는 유용하지 않습니다.

Q: 맞춤형 성능 카운터는 어떻습니까?

프로페셔널 애플리케이션, 특히 서버/서비스의 경우 성능 모니터 카운터와 윈도우즈 이벤트 로그에 대한 로깅을 모두 사용하여 완벽하게 계측될 것으로 예상됩니다.이러한 도구는 Windows의 표준 도구이므로 사용해야 합니다.

사용하는 성능 카운터 및 이벤트 로그에 대한 설치 프로그램을 포함해야 합니다. 이러한 설치 프로그램은 설치 시(관리자로 설치할 때)응용 프로그램이 정상적으로 실행되면 관리 권한이 필요하지 않으므로 누락된 로그를 생성할 수 없습니다.

이것이 비관리자(서비스 등을 설치해야 할 때 별도의 관리자 계정을 사용)로서 개발을 연습해야 하는 좋은 이유입니다.이벤트 로그에 기록하는 경우,NET은 사용자가 처음 로그에 기록할 때 누락된 로그를 자동으로 생성합니다. 비관리자로 개발하면 고객이 시스템을 설치할 때 이를 조기에 발견하고 관리자로 실행되지 않아 사용할 수 없는 심각한 문제를 방지할 수 있습니다.

저는 log4net을 추천하는 합창단에 합류해야 합니다. 저의 경우 플랫폼 유연성(데스크탑)에서 옵니다.Net/Compact Framework, 32/64비트)의 관점입니다.

그러나 개인 레이블 API로 포장하는 것은 주요한 패턴 방지입니다. log4net.ILogger입니다.Commons Logging 래퍼 API의 Net 대응물이므로 이미 커플링은 최소화되어 있으며, Apache 라이브러리이기 때문에 일반적으로 제어를 포기하지 않기 때문에 걱정할 필요가 없습니다. 필요하면 포크를 사용하십시오.

제가 본 대부분의 하우스 래퍼 라이브러리는 하나 이상의 결함을 범하기도 합니다.

  1. 글로벌 싱글톤 로거(또는 이와 동등한 정적 진입점)를 사용하면 클래스당 권장 로거 패턴의 미세 해상도가 손실되어 다른 선택성이 증가하지 않습니다.
  2. 선택적 인수를 노출하지 못해 다음과 같은 여러 문제가 발생합니다.
    • 따라서 예외 로깅 정책을 유지 관리하기가 더욱 어려워지므로 예외와 일관된 작업이 수행되지 않습니다.
    • 일관된 정책을 사용하더라도 예외를 문자열로 포맷하면 데이터가 너무 빨리 손실됩니다.나는 관습을 썼습니다.ILayout이벤트 체인을 결정하기 위해 예외에 대해 상세한 드릴다운을 수행하는 장식자입니다.
  3. 속성을 노출하지 못하면 영역 또는 로깅 수준이 해제될 때 형식 지정 코드를 건너뛸 수 없습니다.

저는 asp.net 에서 자주 개발하지는 않지만, 로거에 관해서는 많은 모범 사례가 보편적이라고 생각합니다.다음은 제가 수년간 배운 벌목에 대한 무작위 생각입니다.

프레임워크

  • logger 구현을 API와 분리할 수 있도록 slf4j와 같은 로거 추상화 프레임워크를 사용합니다(또는 프레임워크를 사용합니다.저는 많은 로거 프레임워크가 왔다 갔다 하는 것을 보았고 당신은 큰 어려움 없이 새로운 로거 프레임워크를 채택할 수 있는 것이 더 좋습니다.
  • 다양한 출력 형식을 지원하는 프레임워크를 찾아보십시오.
  • 플러그인/사용자 지정 필터를 지원하는 프레임워크를 찾습니다.
  • 외부 파일로 구성할 수 있는 프레임워크를 사용하여 고객/소비자가 로그 출력을 쉽게 조정하여 상용 로그 관리 애플리케이션에서 쉽게 읽을 수 있도록 합니다.
  • 사용자 지정 로깅 수준을 초과하지 않도록 하십시오. 그렇지 않으면 다른 로깅 프레임워크로 이동하지 못할 수 있습니다.

로거 출력

  • 치명적인 오류가 발생할 수 있는 로깅을 위해 XML/RSS 스타일 로그를 사용하지 않도록 합니다.를 끄면 스위치가 꺼지기 합니다.</xxx>태그, 로그가 깨졌습니다.
  • 로그 스레드.그렇지 않으면 프로그램의 흐름을 추적하기가 매우 어려울 수 있습니다.
  • 로그를 국제화해야 하는 경우 개발자가 영어(또는 원하는 언어)로만 로그인하도록 할 수 있습니다.
  • 디버깅 상황에서 SQL 쿼리에 로깅 문을 삽입하는 옵션을 갖는 것이 생명을 구할 수 있습니다.예:
클래스 com.foocorp를 호출하는 중입니다.푸꾸러미Foo Class:9021foo에서 *를 선택합니다.
  • 클래스 수준 로깅을 원할 경우일반적으로 로거의 정적 인스턴스도 원하지 않습니다. 이는 미세 최적화할 가치가 없습니다.
  • 모든 예외가 동일하게 생성되지 않기 때문에 기록된 예외를 표시하고 분류하는 것이 유용할 수 있습니다.따라서 중요한 예외의 일부를 미리 파악하는 것이 중요한 상태에 대해 알림을 보내야 하는 로그 모니터가 있는 경우 도움이 됩니다.
  • 중복 필터를 사용하면 시력과 하드 디스크가 절약됩니다.동일한 로깅 문이 10^10000000번 반복되도록 하시겠습니까?그냥 게 This is my logging statement - Repeated 100 times

제 질문도 참조하십시오.

에 대한 로깅에 대해 설명할 자격이 없습니다.넷, 내 빵과 버터가 자바이기 때문에, 우리는 지난 8년 동안 우리의 벌목에서 이주를 했습니다. 당신의 질문과 유용한 비유를 찾을 수 있을 것입니다.

JVM 내의 모든 스레드에서 사용되는 Singleton 로거로 시작하여 전체 프로세스에 대한 로깅 수준을 설정했습니다.이로 인해 시스템의 특정 부분이라도 디버깅해야 하는 경우 엄청난 로그가 생성되었습니다. 따라서 첫 번째 교훈은 로그를 세분화하는 것입니다.

로거의 현재 구현에서는 하나가 기본값으로 정의된 여러 인스턴스를 허용합니다.로깅 수준이 다른 하위 로거는 얼마든지 인스턴스화할 수 있지만 이 아키텍처의 가장 유용한 측면은 로깅 속성을 변경하기만 하면 개별 패키지 및 클래스에 대한 로거를 만들 수 있는 기능입니다.두 번째 교훈은 코드를 변경하지 않고 동작을 재정의할 수 있는 유연한 시스템을 만드는 것입니다.

우리는 Log4J에 싸인 Apache commons-logging 라이브러리를 사용하고 있습니다.

이것이 도움이 되길 바랍니다!

편집 *

아래 Jeffrey Hantin의 게시물을 읽고 우리의 내부 벌목 래퍼가 실제로 무엇이 되었는지 기록했어야 한다는 것을 깨달았습니다.이제 기본적으로 공장에서 올바른 속성 파일을 사용하여 작동하는 로거를 가져오는 데 엄격하게 사용됩니다(기존의 이유로 기본 위치로 이동되지 않음).이제 명령줄에서 로깅 구성 파일을 지정할 수 있기 때문에 더욱 간소화될 것으로 예상되며, 새 응용 프로그램을 시작할 경우 로거를 포장할 필요가 없다는 그의 말에 전적으로 동의합니다.

우리는 직장에서 Log4Net을 로그 인스턴스에 대한 싱글톤 래퍼와 함께 로깅 공급자로 사용합니다(싱글톤이 좋은 아이디어인지 아닌지에 대해 검토 중이지만).

다음과 같은 이유로 선택했습니다.

  • 다양한 환경에서 간단한 구성/재구성
  • 많은 사전 구성된 애펜더
  • 우리가 사용하는 CMS 중 하나는 이미 내장되어 있습니다.
  • 로그 수준 및 구성의 수가 많음

제가 언급해야 할 것은, 이것은 ASP에서 말하는 것입니다.NET 개발 관점

에 있는 추적을 사용하면 몇 가지 장점을 알 수 있습니다.NET Framework를 완전히 판매하지는 않습니다. 주로 제가 일하는 구성 요소가 추적 통화를 전혀 하지 않기 때문입니다.내가 그것을 자주 사용하는 유일한 것은System.Net.Mail제가 알기로는.

그래서 우리는 log4net을 감싸는 라이브러리를 가지고 있으며, 우리의 코드 안에는 다음과 같은 것들이 필요합니다.

Logger.Instance.Warn("Something to warn about");
Logger.Instance.Fatal("Something went bad!", new Exception());

try {
  var i = int.Parse("Hello World");
} catch(FormatException, ex) {
  Logger.Instance.Error(ex);
}

방법 내에서 로깅 수준이 활성화되었는지 확인하여 log4net API에 대한 중복 호출이 발생하지 않는지 확인합니다(따라서 디버그가 활성화되지 않은 경우 디버그 문은 무시됨). 하지만 시간이 나면 업데이트하여 직접 확인할 수 있도록 이러한 호출을 노출할 것입니다.이렇게 하면 평가가 수행되어서는 안 될 때 수행되는 것을 방지할 수 있습니다.

Logger.Instance.Debug(string.Format("Something to debug at {0}", DateTime.Now);

이 작업은 다음과 같습니다.

if(Logger.DebugEnabled) Logger.Instance.Debug(string.Format("Something to debug at {0}", DateTime.Now);

(실행 시간을 조금 절약)

기본적으로 다음 두 위치에서 기록합니다.

  1. 웹 사이트의 파일 시스템(서비스되지 않는 파일 확장명)
  2. 오류 및 치명적인 이메일 전송

파일은 매일 또는 10MB(IIRC)로 롤링됩니다.이벤트 로그는 종종 사이트에 제공하는 것보다 더 높은 보안을 필요로 하기 때문에 사용하지 않습니다.

메모장은 로그를 읽는 데 적합합니다.

어떤 프레임워크를 사용하십니까?

로깅 응용 프로그램 블록과 사용자 지정 로깅 도우미를 함께 사용합니다.넷 프레임워크 비트.LAB는 서비스 방법 입력/종료를 위한 별도의 일반 추적 파일과 예상치 못한 문제를 위한 특정 오류 파일을 포함하는 상당히 광범위한 로그 파일을 출력하도록 구성됩니다.구성에는 디버그 지원을 위한 날짜/시간, 스레드, pId 등과 전체 예외 세부 정보 및 스택(예상치 못한 예외의 경우)이 포함됩니다.

사용자 지정 로깅 도우미는 추적을 사용합니다.상관 관계이며 WF에서 로깅하는 상황에서 특히 유용합니다.예를 들어 일련의 순차적 워크플로우를 호출하는 상태 시스템이 있습니다.이러한 각 호출 작업에서 시작(StartLogicalOperation 사용)을 기록한 다음 마지막에 Gerric 반환 이벤트 핸들러를 사용하여 논리적 작업을 중지합니다.

이 기능은 작업 실행 시퀀스를 기반으로 If/Else 지점 결정 등을 보다 신속하게 결정할 수 있기 때문에 복잡한 비즈니스 시퀀스에서 오류를 디버그할 때 몇 번 유용한 것으로 입증되었습니다.

어떤 로그 출력을 사용합니까?

우리는 텍스트 파일과 XML 파일을 사용합니다.텍스트 파일은 앱 블록을 통해 구성되지만 WF 서비스에서 XML 출력도 제공됩니다.따라서 런타임 이벤트(영구성 등)와 일반적인 비즈니스 유형 예외를 캡처할 수 있습니다.텍스트 파일은 날짜와 크기별로 롤링되는 롤링 로그입니다(총 크기 1MB가 롤오버 포인트라고 생각합니다).

로그를 보는 데 사용할 도구는 무엇입니까?

보고 있는 출력 그룹에 따라 메모장 및 WCF 서비스 추적 뷰어를 사용합니다.WCF Service Trace Viewer는 출력을 올바르게 설정하고 출력을 훨씬 쉽게 읽을 수 있는 경우에 매우 유용합니다.그렇긴 하지만, 만약 내가 오류가 어디에 있는지 대략 안다면 - 주석이 잘 달린 텍스트 파일을 읽는 것도 좋습니다.

로그는 단일 디렉터리로 전송되고, 이 디렉터리는 원본 서비스를 기준으로 하위 디렉터리로 분할됩니다.루트 디렉터리는 지원 사용자 그룹에 의해 제어되는 액세스 권한을 가진 웹 사이트를 통해 노출됩니다.따라서 요청을 제출하지 않고도 프로덕션 로그를 살펴보고 프로덕션 데이터에 대한 긴 레드 테이프 프로세스를 수행할 수 있습니다.

이 도구의 작성자로서 우리는 당연히 SmartInspect를 로깅 및 추적에 사용합니다.NET 응용 프로그램.일반적으로 라이브 로깅에는 명명된 파이프 프로토콜을 사용하고 최종 사용자 로그에는 (암호화된) 이진 로그 파일을 사용합니다.SmartInspect Console을 뷰어 및 모니터링 도구로 사용합니다.

에 대한 로깅 프레임워크 및 도구는 실제로 상당히 많습니다.밖에 NET.DotNetLogging.com 에는 다양한 툴의 개요와 비교가 나와 있습니다.

답에는 좋은 추천사가 많이 있습니다.

일반적인 모범 사례는 누가 로그를 읽을지 고려하는 것입니다.저의 경우에는 고객 사이트의 관리자가 될 것입니다.그래서 저는 그들이 행동할 수 있는 무언가를 주는 메시지를 기록합니다.예를 들어, "응용 프로그램을 초기화할 수 없습니다.이것은 보통 ...에 의해 발생합니다."

우리는 웹 애플리케이션에서 log4net을 사용합니다.

XML 구성 파일을 변경하여 런타임에 로깅을 사용자 지정하는 기능은 응용 프로그램이 런타임에 오작동하고 더 많은 정보를 확인해야 할 때 매우 유용합니다.

또한 로그인할 특정 클래스 또는 속성을 대상으로 지정할 수 있습니다.이는 오류가 발생하는 위치를 파악할 때 매우 유용합니다.전형적인 예는 SQL이 데이터베이스로 이동하는 것을 보려는 NHibernate입니다.

편집:

모든 이벤트를 데이터베이스와 추적 시스템에 기록합니다.오류 또는 예외에 사용하는 이벤트 로그입니다.대부분의 이벤트를 데이터베이스에 기록하여 사용자 정의 보고서를 만들고 사용자가 응용프로그램에서 바로 로그를 볼 수 있도록 합니다.

측면 지향 로깅에 관한 한, 저는 다른 SO 질문에 대해 PostSharp를 추천받았습니다.

Unity\T4\기타 기능을 사용한 측면 지향 로깅

답변에 제공된 링크는 로깅 프레임워크를 평가하는 경우 방문할 가치가 있습니다.

언급URL : https://stackoverflow.com/questions/576185/logging-best-practices