更改日志文件.NET Core + NLog的动态文件路径

A. *_*kiy 1 nlog asp.net-core

在我的.NET Core应用程序中,我使用了一些环境,我想为每个环境执行不同的路径来记录文件.

例如,

Development - c:\logs
Staging - d\apps\logs
Run Code Online (Sandbox Code Playgroud)

对于每个环境,我都有配置部分appsettings.{env}.json:

"LocalPaths": {
    "LogFileRootDirectory": "c:\\logs\\"
}
Run Code Online (Sandbox Code Playgroud)

部分原因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>
Run Code Online (Sandbox Code Playgroud)

实现它的最佳方法是什么?

Jul*_*ian 8

您可以使用(NLog)变量.

例如

<targets>
    <target name="file" xsi:type="File"
        fileName="${var:mydir}/logfile.txt" ... >
Run Code Online (Sandbox Code Playgroud)

并在C#

LogManager.Configuration.Variables["mydir"] = "c:\logs";
Run Code Online (Sandbox Code Playgroud)

更改变量时,路径会自动更改 - 无需重新加载.

另请参阅$ {var}的文档

更新:您可以更改LogManager.Configuration后:

env.ConfigureNLog("nlog.config");
Run Code Online (Sandbox Code Playgroud)

例如你的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";
    ...
Run Code Online (Sandbox Code Playgroud)