2012-02-25 3 views
0

애스펙트에서 로그 항목을 작성할 때 내 로그 파일의 레이아웃을 변경해야합니다. 시간이 지나면 다른 설정도 변경해야 할 것입니다.다른 용도로 레이아웃을 변경해야합니다.

필요한 레이아웃을 생성하는 두 개의 FileTargets를 만들었습니다.

LoggingConfiguration config = new LoggingConfiguration(); 
    LoggingConfiguration aspectConfig = new LoggingConfiguration(); 

    FileTarget fileTarget = new FileTarget(); 
    fileTarget.Name = "fileTarget"; 
    fileTarget.Layout = "${longdate} ${machineName} ${callsite} ${message} ${exception:format=tostring}"; 
    fileTarget.FileName = String.Format("{0}Admin.log", Config.DatabasePath); 
    fileTarget.KeepFileOpen = false; 


    FileTarget aspectTarget = new FileTarget(); 
    aspectTarget.Name = "aspectTarget"; 
    aspectTarget.Layout = "${longdate} ${machineName} ${message} ${exception:format=tostring}"; 
    aspectTarget.FileName = String.Format("{0}Admin.log", Config.DatabasePath); 
    aspectTarget.KeepFileOpen = false; 


    LoggingRule rule2 = new LoggingRule("*", LogLevel.Trace, fileTarget); 
    config.LoggingRules.Add(rule2); 

    LoggingRule aspectRule = new LoggingRule("aspects", LogLevel.Trace, aspectTarget); 
    aspectConfig.LoggingRules.Add(aspectRule); 


    LogManager.Configuration = config; 

다른 변경 사항이있을 수 있습니다/차이점은이 단계에서 포인트 외에 있습니다.

'를 사용하여 설정 예 :

var log = LogManager.GetCurrentClassLogger(); 
    log.Fatal("##########################################"); 

를 할 원하는 것이되어 사용할 수 있습니다' '기본 또는'*에 대한 좋은 다음 작품을 사용하여 aspectRule '보다는 기본을'* ' 규칙을 로거를 호출하고 'aspectRule'을 지정합니다.

나는이 일 것이라고 생각했다 :

잘 좋은입니다
var log = LogManager.GetLogger("aspects"); 
    log.Fatal("########################################"); 

하지만 난 특히 난 생성하지 않는 코드에서와 같이 '측면'라는 새로운 로거를 정의하는 방법을 볼 수 없습니다 Logger from '*':-)

XML 구성 파일을 사용하지 않고 프로그래밍 방식으로 솔루션을 사용해야한다는 점에 유의하십시오.

아이디어가 있으십니까?

편집 : 나는이 예에서와 같이 1 개 로그 항목을 작성해야

:

if (someCondition) 
    logger.Fatal("#############"); // use layout in fileTarget 
    else 
    logger.Fatal("##############"); // use layout in aspectTarget 

답변

2

편집 : 편집 된 질문에 대답하기, LoggingRule rule2 = new LoggingRule("*", LogLevel.Trace, fileTarget) 로그 파일에 어떤 출력을 기록합니다 .

특정 출력을 원하면 NLog와 관련이 있어야합니다. 예를 들어, Trace에서 최대 fileTarget ("*")와 Info에 이르기까지 아무것도를 기록하고 Error에서 Fatal에 로그 수준이 다른 두 특정 목표 aspectsrule2 있습니다.

그럼 당신은 이런 식으로 로그온 할 수 :

LogManager.GetCurrentClassLogger().Debug("Non-specific message"); 
LogManager.GetLogger("rule2").Fatal("From rule2"); 
LogManager.GetLogger("aspects").Fatal("From Aspects"); 

-

을 당신은 두 가지 구성 configaspectConfig을 만드는 모두를 설정하고 결국 LogManager.Configuration = config을 설정하고 있습니다.

결국 aspectConfig이 사용되지 않습니다. 해결하려면 모든 aspectConfig 관련 코드를 제거하고이에 acpects 라인을 수정 :

config.LoggingRules.Add(aspectRule);

+0

은 무엇 당신이 제안하는 것은 내가 원래 한 것입니다. 즉, log.Fatal ("####")을 실행하면 항목이 로그에 두 번 기록됩니다. 내 질문은 - 한 항목 만 기록하는 방법입니다. 나는 그것이 더 명확하게하기 위해 나의 질문을 ameneded ... – David

+0

감사합니다. LogManager.GetLogger (????)는 나 대신에 무엇을 넣어야할지 혼란스럽게했다. . – David

+0

그래, 특정 대상에 대한 특정 로거. NLog는 정말 멋진 라이브러리입니다. 즐겨. – AVIDeveloper

관련 문제