2017-03-02 71 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

相关问题