У меня есть два приложения на 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?
Спасибо!