簡體   English   中英

以編程方式在運行時更改 NLog 目標中的 basedir

[英]Change basedir in NLog Targets in runtime programmatically

我有使用 NLog 的 Windows 窗體應用程序 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(); 也是,但不工作。

有什么建議?

在這種情況下使用變量更容易。 ( ${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}文檔

更新:在這種情況下,您正在讀取 .config 文件,這可以僅通過 NLog 配置來完成(不需要 C#!)

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

例如

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

另請參閱${appsetting}文檔

修改 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}&#009;| ${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>

代碼隱藏: string str = LogManager.Configuration.Variables["basedir"].Text; LogManager.Configuration.Variables["basedir"] = @"D:\\LogDir";

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM