[英]Change basedir in NLog Targets in runtime programmatically
I have Windows Forms app NET 4.5 (VS 2013) using NLog.我有使用 NLog 的 Windows 窗体应用程序 NET 4.5 (VS 2013)。
I have targets:我有目标:
<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();
returns 4 items, not 2 items.返回 4 个项目,而不是 2 个项目。
I want change the path ${basedir}/logs in runtime, programmatically我想以编程方式在运行时更改路径${basedir}/logs
I try this:我试试这个:
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;
}
Not generates anything.不产生任何东西。 I try using
LogManager.ReconfigExistingLoggers();
我尝试使用
LogManager.ReconfigExistingLoggers();
too, but not working.也是,但不工作。
Any suggestions?有什么建议?
It's easier to use variables in this case.在这种情况下使用变量更容易。 (
${var:...}
) (
${var:...}
)
For this example:对于这个例子:
<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>
...
Changing the variable in C#在 C# 中更改变量
// create or edit
LogManager.Configuration.Variables["basedir"] = "d:/mybasedir";
No need for LogManager.ReconfigExistingLoggers();
不需要
LogManager.ReconfigExistingLoggers();
or looping over all the targets!或循环遍历所有目标!
See also the ${var}
documentation另请参阅
${var}
文档
Update : in this case your are reading from .config files, this could be done with only NLog configuration (no C# needed!)更新:在这种情况下,您正在读取 .config 文件,这可以仅通过 NLog 配置来完成(不需要 C#!)
Install NLog.Extended and use ${appsetting:name=..}
安装NLog.Extended并使用
${appsetting:name=..}
eg例如
fileName="${var:basedir}/logs/${appsetting:name=RutaLog}Trace.log"
See also the ${appsetting}
documentation另请参阅
${appsetting}
文档
Modify Nlog.Config like below:修改 Nlog.Config 如下:
<variable name="basedir" value="${basedir}" />
<targets async="true">
<target name="fileAsync" xsi:type="File" keepFileOpen="true" encoding="iso-8859-2" concurrentWrites="false"
layout="${date:format=yyyy-MM-dd, HH\:mm\:ss.fff} | [${threadid}] | ${level:uppercase=true}	| ${message}."
fileName="${var:basedir}/Log/log_${date:format=yyyy-MM-dd}.log"
archiveFileName="${var:basedir}/Log/archive/${date:format=yyyy}/${date:format=MM}/${date:format=dd}/log_${date:format=yyyy-MM-dd_hh}.log"
archiveEvery="Day" maxArchiveFiles="2048" enableFileDelete="true" archiveAboveSize="53248000" />
</targets>
Code behind: string str = LogManager.Configuration.Variables["basedir"].Text;代码隐藏: string str = LogManager.Configuration.Variables["basedir"].Text; LogManager.Configuration.Variables["basedir"] = @"D:\\LogDir";
LogManager.Configuration.Variables["basedir"] = @"D:\\LogDir";
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.