2011-11-18 3 views
1

정말 코딩 문제는 아니지만 새로운 로거 구현을 개발하는 동안 내가 가지고있는 몇 가지 문제에 대한 커뮤니티의 의견을 듣고 있습니다.로거 만들기

배경

우리의 ASP.NET 응용 프로그램은 원래 log4net로했다. log4net은 훌륭한 로깅 도구이지만, 우리의 요구에 맞지 않으며 어떤 경우에는 로깅이 수행되는 방식으로 인해 응용 프로그램에 문제가 발생합니다. 현재 우리는 log4net의 일부 동작을 모방하면서 우리의 필요에 맞게 조정 된 자체 로깅 시스템을 구현하고 있습니다. 나는 log4net의 사용법이나 설정 방법에 관해서 논하지 않았다.

시스템

현재 우리는 개발중인 시스템을 보유하고 있습니다. 시스템에는 싱글 톤 (디자인 상 결함 ...)이며이 클래스에는 IReporter 개체가 포함되어있는 로거 클래스가 있습니다.

매번 응용 프로그램이 호출 Logger.Instance.Log (메시지) 로거 큐 내의 모든 IReporter에 이러한 메시지를 직접 것이며, 기자가 목적지/저장 /에 메시지를 로깅의 책임이 무엇이든 .

현재 각각을 선택했습니다. IReporter에는 backgroundthread와 메시지 대기열이있어 각자의 속도로 메시지를 처리합니다. 여기서 위험은 앱이 갑자기 죽으면 메시지의 일부를 잃을 수 있다는 것입니다.

우리가 염두에두고 있던 또 다른 접근 방법은 로거에 스레드 풀을 갖고이 스레드를 대기열로 실행시킨 다음 메시지를 기자에게 위임시키는 것입니다.

나는 성능에 대해 우려하고 있습니다. 우리는 처음에 로거에서 이벤트를 사용하여이 작업을 구현했지만, 생성 된 스레드는 파일에 액세스 할 때 고속으로 끊어졌습니다. 이제이 접근법을 통해 리소스에 대한 액세스를 제한 할 수 있습니다.

비슷한 상황에 처한 사람들이 어떻게이 문제에 접근했는지 알아볼 것입니다.

+3

NLog를 보았습니까? http : // nlog-project.org/ –

+0

우리는 상용 응용 프로그램을 다루므로 오픈 소스는 실제로 옵션이 아닙니다. –

+0

즉시 도움을 얻지는 못하지만 NLog 및 Log4net의 소스를 살펴 보는 것이 좋습니다. 그들은 로깅이 실행 가능한지 확인하기 위해 많은 시간을 보냈습니다. 또한 app *에서 구성한 경우를 제외하고는 로깅을 사용하지 않도록 설정 한 다음 필요할 때 프로덕션 환경에서 사용하도록 설정할 수 있습니다. 여기에는 trace 문 앞에 'if'블록을 삽입하거나 추적 문을 위임자에 넣는 작업이 포함되어 있으므로 로깅을 사용하지 않으면 문자열 형식화 코드가 실행되지 않습니다. BG 스레드 문제를 돕지 않을거야,하지만 그들은 너무 (난 단지 어떻게 모르겠 :) 해결 –

답변

2

정확하게 이해했는데 모든 프로세스가 동일한 파일 집합에 액세스 했습니까? Windows에서?

OS가 파일에 액세스하는 방법에 따라 시간이 걸릴 수있는 복잡한 잠금을 수행하거나 교착 상태가 발생할 수 있으므로이를 수행하지 마십시오. 하나의 단일 스레드에서 모든 로깅을 수행하고 IReporter를 순차적으로 실행하는 것이 좋습니다.

로그 작업 중에 소프트웨어가 죽는 것이 염려되는 경우 로거를 다른 프로세스에 넣고 IPC에서 통신하십시오. 하지만 syslogd를 재발견하고 싶습니까?

+0

목표는 각 로그 파일에 대해 1 명의 리포터를 갖는 것입니다. 특히 여러 스레드가 특정 로그 파일에 액세스하여 문제가 발생하는 것을 방지해야합니다. –

0

귀하의 디자인은 FileAppender의 무리와 함께 Log4Net과 매우 흡사합니다. 당신이 공유하지 않은 요구 사항이 없다면, 정말로 당신의 결정을 재고해야합니다. Log4Net은 로트을 당신의 로거보다 더 많이 사용합니다. 이미 많은 버그와 성능 문제가있었습니다.