我有两个使用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的日志文件?
谢谢!