我有使用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();
,但没有工作。
有什么建议吗?
答案 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();
或循环覆盖所有目标!
更新:在这种情况下,您正在读取.config文件,这可以仅使用NLog配置完成(不需要C#!)
安装NLog.Extended并使用${appsetting:name=..}
e.g。
fileName="${var:basedir}/logs/${appsetting:name=RutaLog}Trace.log"
答案 1 :(得分:0)
如下所示修改Nlog.Config:
forEach
后面的代码: 字符串str = LogManager.Configuration.Variables [“ basedir”]。Text; LogManager.Configuration.Variables [“ basedir”] = @“ D:\ LogDir”;