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

时间:2017-03-22 07:40:47

标签: asp.net-core nlog

在我的.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>

实施该方法的最佳方法是什么?

3 个答案:

答案 0 :(得分:6)

您可以使用(NLog)变量。

e.g。

<targets>
    <target name="file" xsi:type="File"
        fileName="${var:mydir}/logfile.txt" ... >

和C#

LogManager.Configuration.Variables["mydir"] = "c:\logs";

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

另见the docs for ${var}

更新:您可以在以下后更改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)

他们在GitHub repository

上说明了这一点
  

.NET Core问题:

     
      
  • ${basedir}在.NET Core
  • 中不起作用   
  • LogManager.GetCurrentClassLogger()将使用文件名而不是   完整的类名(类名和命名空间,如NLog 4中)。这个   将在NLog 5的最终版本中修复(在NETSTANDARD发布之后   2.0)
  •   

所以你现在不能这样做。也许他们将来会解决这个问题。