2017-03-02 27 views
5

我有使用NLog的Windows窗體應用程序NET 4.5(VS 2013)。以編程方式在運行系統中更改NLog目標中的basedirir

我的目標:

<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項。

我想更改路徑$ {BASEDIR} /日誌在運行時,編程

我試試這個:

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; 
} 

不產生任何東西。 我也嘗試使用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> 
    ... 

改變變量在C#

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

無需LogManager.ReconfigExistingLoggers();或遍歷所有的目標!

又見${var} documentation

更新:在這種情況下,你是從.config文件閱讀,這可能只有NLOG配置來完成(沒有C#的需要!)

安裝NLog.Extended和使用${appsetting:name=..}

eg

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

參見使用'文件名= 「$ {VAR:BASEDIR} /日誌/ $ {} shortdate trace.log中的」 ${appsetting} documentation

+1

作品'和'使用文件名=「$ {appsetting作品:名稱= RutaLog} $ {} shortdate trace.log的「'。使用*** $ {appsetting:name = key} ***更清楚。 – Kiquenet

相關問題