log4net.async를 사용하여 별도의 스레드를 사용하여 로그를 시작했지만 처음에는 예상했던 것보다 성능이 향상되지 않았으며 로깅 할 문자열의 일부가 매우 길기 때문에 그 이유를 알 수 있습니다 수신 된 메시지의 등록 정보.log4net.async를 사용할 때 어떻게 log4net 디버깅을 최적화 하시겠습니까?
그래서 예를 들어, 우리가 할 수있는 :
theLogger.Debug(msg.ToString());
은 "ToString()"메소드는 메시지를 나타내는 정말 긴 문자열을 생성 할 수라고하며 느린 (실제로 생성에 좀 걸릴 우려가있을 때 비 직렬화 등). 메시지를 로깅하는 것이 중요하지만 현재 실행중인 스레드가 아닌 별도의 스레드에서 메시지를 "문자열 화"하여 현재 실행중인 스레드가 처리를 계속할 수 있도록하는 것이 좋습니다. 어떻게하면 log4net을 "ToString()"결과를 평가하게 만들지, 아니면 별도의 스레드에서 메시지 객체를 "문자열 화"할까요?
'msg'는 변경 가능하지 않습니다 (또는이 로그 작업이 대기열에 넣어 진 후 적어도 변경되지 않았습니까?). 그러면 다른 스레드에서이 방법으로 안전하게 액세스 할 수 있습니까? – Servy
@CodeCaster이 질문은 릴리스 모드에서 디버그 호출을 제거하고'Action '을 제공하는 것이 도움이되지 않는다고 생각하지 않습니다. OP는 백그라운드 쓰레드 (모든 메시지뿐만 아니라 디버그도 아닌)에서 파일에 메시지를 쓰는 포워딩 appender를 사용하며, 그는 asynchronous forwarder의 백그라운드 스레드에서 발생하도록'msg.ToSring()'의 실행을 지연하려고합니다. 따라서 호출을 디버그하는 것과 관련이 없으며 IsDebugEnabled 설정이나 조건부 컴파일과 관련이 없습니다. –
Evk
@Evk 네 말이 맞아, 내가 그걸 놓친, 재개했다. 감사. log4net.async에 대한 경험이 없지만 문제가 몇 밀리 초 앞당겨집니다. 다른 스레드가 로그 메시지를 "문자열로 표시"하는 한 다른 스레드는 해당 스레드가 다시 사용 가능할 때까지 차단합니다. 또는 log4net.async에 대기열이 내장되어 있습니까? – CodeCaster