以编程方式将FileTarget FileName设置为另一个FileTarget FileName

时间:2018-10-04 20:45:22

标签: c# nlog

我有两个使用NLog的C#应用​​程序。我的一个应用程序具有一些NLog配置,如下所示:

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" autoReload="true" throwExceptions="true" internalLogFile="nlogerrors.log">
  <variable name="logDirectory" value="${when:when='${environment:logs_dir}'='':inner=${basedir}/logs/:else=${environment:logs_dir}}" />
  <targets>
    <target name="myLogFile" xsi:type="File" fileName="${logDirectory}/${shortdate:universalTime=true}/today.log" createDirs="true" keepFileOpen="true" encoding="utf-8" layout="[[${level}] ${message}${exception:format=ToString}">
    </target>
  </targets>
  <rules>
    <logger name="MyLogger" minlevel="Trace" writeTo="myLogFile" />
  </rules>
</nlog>

我的第二个应用程序正在计算机上的另一个位置运行。但是,我想将该应用程序的日志写入与其他应用程序相同的文件中。据我所知,由于其他应用程序配置文件中使用的变量,我遇到了问题。目前,在第二个应用程序中,我有以下代码:

// Get the file name of the first app
var app1Config = new NLog.Config.XmlLoggingConfiguration(GetApp1NLogConfigPath()));
var app1Target = GetFileTarget(app1Config); // Returns the FileTarget of App1
var app1FilePathLayout = app1Target.FileName as NLog.Layouts.SimpleLayout;

var app2Config = LogManager.Configuration;
foreach (var variable in app1Config.Variables)
{
  var value = variable.Value;
  if (variable.Key == "logDirectory")
  {
    var logsEnvironmentVariable = Environment.GetEnvironmentVariable("logs_dir");
    var logsDirectory = String.IsNullOrWhiteSpace(logsEnvironmentVariable) ? GetApp1NLogDirectory(): logsEnvironmentVariable;
    value.Text = logsDirectory;

    Console.WriteLine("Set 'logDirectory' variable to '" + value.Text + "'");
  }

  if (app2Config.Variables.ContainsKey(variable.Key))
    app2Config.Variables[variable.Key] = value;
  else
    app2Config.Variables.Add(variable.Key, value);
}

var app2Target = GetFileTarget(app2Config);
app2Target.FileName = app2Target.FileName;
Console.WriteLine("Target FileName '" + app2Target.FileName + "'.");
LogManager.ReconfigExistingLoggers();

运行此命令时,我的第二个应用程序未按预期将日志写入第一个应用程序日志文件。相反,它们是相对于我的第二个应用程序编写的。我有以下内容:

Set 'logDirectory' variable to 'C:\MyApp1\bin\Debug'
Target FileName  ''${when:when='${environment:logs_dir}'='':inner=${basedir}/logs/:else=${environment:logs_dir}}/${shortdate:universalTime=true}/today.log''.

我不明白为什么会这样。我想将app2中的target设置为指向与app1相同的位置。我希望日期也能继续自动过渡。预计app2Target.FileName为“ $ {logDirectory} / $ {shortdate:universalTime = true} /today.log”。我不明白为什么它会返回结果。

我的问题是,如何让App2将日志写入App1的日志文件?

谢谢!

0 个答案:

没有答案