2017-03-02 15 views
5

NLogを使用してWindowsフォームアプリケーションNET 4.5(VS 2013)を使用しています。実行時にプログラムでNLogターゲットの基底を変更します

<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ファイルをから読んでいるこの場合には、これが唯一のNLog構成で行うことができる(何のC#は必要ありません!)

NLog.Extendedをインストールし、${appsetting:name=..}を使用

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

も参照してください${appsetting} documentation

+1

ワークス 'ファイル名は= "$ {VAR:BASEDIR} /ログ/ $ {shortdate}のtrace.log" を使用して'と 'ファイル名が=" $ {のAppSettingを使用して動作します。名前= RutaLog} $ {shortdate} Trace.log "。 *** $ {appsetting:name = key} ***を使用するとより明確になります。 – Kiquenet

関連する問題