2011-03-11 7 views
12

클래스 라이브러리 프로젝트에 대해 Nlog Refresh 1.0을 사용하여 간단한 로그를 구현하려고합니다. nlog는 dll에서 인스턴스화 될 때 로그 파일을 생성하지 않습니다.DLL에 NLog를 사용하는 방법

다른 방법이 있습니까?

내 설정 파일은 다음과 같습니다

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     throwExceptions="true"> 

    <targets> 
     <target name="file" xsi:type="File" fileName="${basedir}/nlog.txt" /> 
     <target name="console" xsi:type="Console" /> 
    </targets> 

    <rules> 
     <logger name="*" minlevel="Info" writeTo="file" /> 
     <logger name="*" minlevel="Info" writeTo="console" /> 
    </rules> 

</nlog> 

나는 그것이 EXE 프로젝트 내에서 작동하기 때문에이 설정 아무 문제가없는 것을 알고있다.

편집 : 명확히하기 위해 : 내 DLL을 플러그인으로 사용하는 호출 프로그램에 대한 액세스 권한이 없습니다. 호출 프로그램은 사실 내 dll을 플러그인으로 사용하는 Outlook입니다. 나는 내 dll에만 관련이 있고 Outlook 자체와 아무 관련이없는 로그를 유지하려고합니다.

답변

32

dll을 사용하는 exe 파일의 위치에 nlog.config를 추가해야합니다!

편집 : 그 난 당신이 코드에서 그것을 구성해야합니다 생각에는 옵션이없는 경우 당신은 EXE 파일 그냥 같은 디렉토리에 nlog.config을 배치 수정할 필요가 없습니다 https://github.com/nlog/NLog/wiki/Configuration-API

+2

, 내 DLL을 호출하는 EXE 파일에 액세스 할 수없는, 차라리 내 DLL을 withing에에서 nlog를 구성 할 것입니다. – Oysio

+2

@Petoj가 솔루션으로 구성 API를 사용하도록 정확하게 지적 했으므로이 부분을 "대답"으로 표시해야합니다. 내 Upvote! – dotnetguy

2

당신이해야 위와 같이 구성 파일을 웹 응용 프로그램의 경우 web.config에, Windows 응용 프로그램의 경우 app.config에 넣습니다. 이 작업은 자동으로 수행되지 않으며 클래스 라이브러리에 app.config가 있으면 다른 응용 프로그램에서 클래스 라이브러리를 호출 할 때 사용되지 않습니다.

+3

nlog는 nlog.config를 독립 실행 형으로 지원하므로 web.config/app.config에 추가 할 필요가 없습니다. – Peter

5

NLog는 DLL이 포함 된 exe에서 구성 파일을 찾습니다. 따라서 DLL을 사용할 때마다 NLog 용 구성 파일을 복사해야합니다.

많은 타사 응용 프로그램이 DLL을 여러 가지 방식으로 사용할 수 있으며 DLL의 로그를 로그와 함께 중앙화하려는 경우 이론적으로 이는 올바른 디자인 패턴입니다.

제 경우에는 DLL의 로그가 우리 자신의 구성 파일을 사용하여 저장된다는 것을 100 % 확신하여 모든 치명적인 오류가 SqlServer 등에보고되도록했습니다. 따라서 우리는 타사 응용 프로그램이 자체 로깅 논리를 설정하지 않도록하십시오.

NLog (또는 Log4Net)에서 구성 파일을 찾을 수없는 것과 동일한 문제가 발생하여 로깅 활동이 시작되지 않았으며 예외/오류 메시지가 NLog 또는 Log4Net에서 인쇄되지 않았습니다.

유일한 대안은 코드를 사용하여 DLL에 NLog (또는 Log4Net)를 구성하는 것입니다. NLog는 구성 파일을 버릴 수 있도록 Configuration API를 제공합니다. NLog configuration API

필자의 경우 제 DLL을 사용하는 제 3 자 클래스 (예 : Utils.doSomething())에서 호출되는 내 클래스에는 'Utils'라는 정적 클래스가 있습니다. 그래서 정적 생성자에서 NLog을 구성

내 질문을 편집 한
static void Utils() // static constructor 
{ 
    // Step 1. Create configuration object 
    var config = new LoggingConfiguration(); 

    // Step 2. Create targets and add them to the configuration 
    var consoleTarget = new ColoredConsoleTarget(); 
    config.AddTarget("console", consoleTarget); 

    var fileTarget = new FileTarget(); 
    config.AddTarget("file", fileTarget); 

    // Step 3. Set target properties 
    consoleTarget.Layout = @"${date:format=HH\:mm\:ss} ${logger} ${message}"; 
    fileTarget.FileName = @"C:\global-logs\logs.txt"; 
    fileTarget.Layout = "${message}"; 
    // Step 4. Define rules 
    var rule1 = new LoggingRule("*", LogLevel.Debug, consoleTarget); 
    config.LoggingRules.Add(rule1); 

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

    // Step 5. Activate the configuration 
    LogManager.Configuration = config; 
} 
+0

좀 더 설명 할 수 있습니까? –

+0

수정 됨 이게 도움이 되니? – TheWalkingPanda