Программно установить FileTarget FileName на Другой FileTarget FileName - PullRequest
0 голосов
/ 04 октября 2018

У меня есть два приложения на C #, которые используют NLog.Одно из моих приложений имеет конфигурацию 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''.

Я не понимаю, почему это происходит.Я бы хотел установить target в app2 так, чтобы он указывал на то же местоположение, что и app1.Я хочу, чтобы дата автоматически продолжалась.Я ожидал, что app2Target.FileName будет "$ {logDirectory} / $ {shortdate: universalTime = true} /today.log".Я не понимаю, почему он вернул то, что сделал.

Мой вопрос: как заставить App2 записывать журналы в файл журнала App1?

Спасибо!

...