2017-03-02 1 views
5

NLog를 사용하는 Windows Forms 앱 NET 4.5 (VS 2013)가 있습니다.런타임에 NLog 대상의 basedir을 프로그래밍 방식으로 런타임에

<target name="asyncFileLog" xsi:type="AsyncWrapper"> 
    <target name="logfileTrace" xsi:type="File" fileName="${basedir}/logs/${shortdate}Trace.log" layout="${longdate} ${message}" lineEnding="Default"/> 
</target> 

<target name="asyncFileError" xsi:type="AsyncWrapper"> 
    <target name="logfileError" xsi:type="File" fileName="${basedir}/logs/${shortdate}Error.log" layout="${longdate} ${message} ${exception:format=tostring}" lineEnding="Default"/> 
</target> 

LogManager.Configuration.AllTargets.ToList(); 반환 4 개 항목이 아닌 2 개 항목 :

나는 목표를 가지고있다.

var rutaLogs = ConfigurationManager.AppSettings["RutaLog"]; 
if (!Directory.Exists(rutaLogs)) return; 

var list = LogManager.Configuration.AllTargets.ToList(); 
foreach (var target in list) 
{ 
    FileTarget fileTarget = null; 
    var wrapperTarget = target as WrapperTargetBase; 

    // Unwrap the target if necessary. 
    if (wrapperTarget == null) 
    { 
     fileTarget = target as FileTarget; 
    } 
    else 
    { 
     fileTarget = wrapperTarget.WrappedTarget as FileTarget; 
     continue; 
    } 

    var value = fileTarget.FileName.ToString(); 
    value = value.Replace("${basedir}/logs/", rutaLogs); 
    fileTarget.FileName = value; 
} 

없음 아무것도 생성

나는

나는이 시도 프로그래밍, 런타임에 경로를 $ {BASEDIR}/로그을 변경합니다. LogManager.ReconfigExistingLoggers();도 사용해 보았지만 작동하지 않습니다.

제안 사항?

답변

7

이 경우 변수를 사용하는 것이 더 쉽습니다. 이 예를 들어 (${var:...})

:

<variable name="basedir" value="${basedir}" /> <!-- default, optional --> 

<targets> 
    <target name="asyncFileLog" xsi:type="AsyncWrapper"> 
    <target name="logfileTrace" xsi:type="File" 
      fileName="${var:basedir}/logs/${shortdate}Trace.log" 
      layout="${longdate} ${message}" lineEnding="Default"/> 
    </target> 
    ... 

LogManager.ReconfigExistingLoggers();에 대한 C#으로

// create or edit 
LogManager.Configuration.Variables["basedir"] = "d:/mybasedir"; 

필요 없음을 변수를 변경 또는 모든 대상을 통해 반복!

도 참조 ${var} documentation

업데이트 : 귀하의 .config 파일에서 읽고이 경우,이 (! 더 C 번호가 필요하지 않습니다)

NLog.Extended를 설치하고 ${appsetting:name=..} 만 사용 NLog 구성을 할 수있다

예 :

fileName="${var:basedir}/logs/${appsetting:name=RutaLog}Trace.log" 

도 참조 ${appsetting} documentation

+1

'fileName에 = "$ {VAR : 기본 디렉토리}/로그/$ {shortdate} Trace.log"을 사용하여 작품'와'fileName에 = "$ {appsetting 사용하여 작동 : 이름을 = RutaLog} $ {shortdate} Trace.log "'. *** $ {appsetting : name = key} ***을 사용하는 것이 더 명확합니다. – Kiquenet

관련 문제