以编程方式在运行时更改基于NLog目标的基础

时间:2017-03-02 08:56:48

标签: c# nlog

我有使用NLog的Windows Forms app .NET 4.5(VS 2013)。

我有目标:

<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} / logs

我试试这个:

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();,但没有工作。

有什么建议吗?

2 个答案:

答案 0 :(得分:12)

在这种情况下,使用变量更容易。 (${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=..}

e.g。

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

另请参阅${appsetting} documentation

答案 1 :(得分:0)

如下所示修改Nlog.Config:

forEach

后面的代码: 字符串str = LogManager.Configuration.Variables [“ basedir”]。Text; LogManager.Configuration.Variables [“ basedir”] = @“ D:\ LogDir”;