在我的.NET Core应用程序中,我使用了一些环境,并且我想为每个环境执行不同的路径来记录文件。
例如,
Development - c:\logs
Staging - d\apps\logs
对于每个环境,我都有appsettings.{env}.json
中的配置部分:
"LocalPaths": {
"LogFileRootDirectory": "c:\\logs\\"
}
nlog.config
的一部分:
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
autoReload="true"
internalLogLevel="Warn"
internalLogFile="${logFileRootDirectory}internal-nlog.txt">
...
</nlog>
实施该方法的最佳方法是什么?
答案 0 :(得分:6)
您可以使用(NLog)变量。
e.g。
<targets>
<target name="file" xsi:type="File"
fileName="${var:mydir}/logfile.txt" ... >
和C#
LogManager.Configuration.Variables["mydir"] = "c:\logs";
更改变量时,路径会自动更改 - 无需重新加载。
更新:您可以在以下后更改LogManager.Configuration
:
env.ConfigureNLog("nlog.config");
e.g。你的startup.cs看起来像这样:
public void Configure(IApplicationBuilder app, IHostingEnvironment env,
ILoggerFactory loggerFactory)
{
//add NLog to ASP.NET Core
loggerFactory.AddNLog();
//add NLog.Web
app.AddNLogWeb();
//configure nlog.config in your project root.
env.ConfigureNLog("nlog.config");
LogManager.Configuration.Variables["mydir"] = "c:\logs";
...
答案 1 :(得分:1)
NLog.Extension.Logging版本。 1.4支持${configsetting}
直接从appsetting.json读取:
<targets>
<target name="file" xsi:type="File"
fileName="${configsetting:LocalPaths.LogFileRootDirectory}/logfile.txt" ... >
另请参阅:https://github.com/NLog/NLog/wiki/ConfigSetting-Layout-Renderer
答案 2 :(得分:0)
.NET Core问题:
- 中不起作用
${basedir}
在.NET CoreLogManager.GetCurrentClassLogger()
将使用文件名而不是 完整的类名(类名和命名空间,如NLog 4中)。这个 将在NLog 5的最终版本中修复(在NETSTANDARD发布之后 2.0)
所以你现在不能这样做。也许他们将来会解决这个问题。