2011-09-07 2 views
4

런타임시 로거 인스턴스의 클래스 이름을 변경할 수있는 방법이 있는지 궁금합니다. 모든 클래스에서 로거를 생성하지 않고 생성자를 통해 주입하려고합니다. 하지만 그 후에는 이벤트를 호출하는 잘못된 클래스 이름을 파일에 저장합니다. 정보 | | C1 | C1 시험
2011-09 59.7521 : 33 :이NLog. 클래스 이름 변경

public class c1 
{ 
    private Logger _logger = LogManager.GetCurrentClassLogger(); 
    public void doSmth() 
    { 
     c2 myC2= new c2(_logger); 
     myC2.LogSomething(); 
    } 

    public void LogSomething() 
    { 
     _logger.Info("c1 test"); 
    } 
} 


public class c2 
{ 
    private Logger _logger; 

    public c2(Logger logger) 
    { 
     this._logger = logger; 
    } 

    public void LogSomething() { 
     _logger.Info("c2 test"); 
    } 
} 

모든 것이 잘 웍하지만 로그 파일에 우리가

2011-09-07 09을 얻을 같은 프로젝트 구조는 -07 09 : 33 : 59.7611 | 정보 | C1 | C2 시험 대신 ${logger} 레이아웃 렌더러의

+0

각 클래스마다 로거를 만들지 않는 특별한 이유가 있습니까? – MichaelMocko

+0

이것은 정상적인 동작입니다. 로거는'c1' 클래스로만 초기화되므로 로거 이름은 항상'c1'이됩니다. 로거 이름을 현재 클래스 이름으로 사용하려면 가장 좋은 방법은'private Logger _logger = LogManager.GetCurrentClassLogger(); '를 사용하여 모든 클래스에 로거를 만드는 것입니다. 왜 네가 원하지 않는지 나는 모르겠다. 왜 당신에게 문제가되는지 설명해 주시겠습니까? – Otiel

+1

로거 인스턴스는 정적 일 수 있습니다. 이렇게하면 CPU 시간과 리소스가 절약됩니다. 개인 정적 로거 _logger = LogManager.GetCurrentClassLogger(); – LostInComputer

답변

2

${callsite} 렌더러를 사용합니다.

<target xsi:type="Trace" 
      name="t" 
layout="${callsite:className=true:includeSourcePath=false:methodName=false} 
| ${message}" /> 

예상 결과가 나옵니다.