为什么我不能使用nlog将日志跟踪写入文件?

时间:2019-08-20 17:17:52

标签: c# asp.net-core asp.net-web-api logging nlog

我开始学习如何在.net核心Web API应用程序中配置nlog。并阅读了一些教程,并尝试从github上的官方教程中实现该实现

1)创建nlog.confiq xml文件

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  autoReload="true" 
  internalLogLevel="Trace" 
  internalLogFile="D:/Projects/appstore2/AppStore/AppStore.DataAccessLayer/Logs/InnerLog.txt">

<extensions>
  <!--enable NLog.Web for ASP.NET Core-->
  <add assembly="NLog.Web.AspNetCore"/>
</extensions>

<variable name="PathToFile" value="D:/Projects/appstore2/AppStore/AppStore.DataAccessLayer/Logs"/>

<!-- define various log targets -->
<targets async="true">    
  <!-- write logs to file -->
  <target name="logfile" xsi:type="File" fileName="D:/Projects/appstore2/AppStore/AppStore.DataAccessLayer/Logs/${shortdate}_log.txt" layout="${longdate} ${level:uppercase=true} ${message}"/>

</targets>

<rules>
  <logger name="*" minlevel="Trace" writeTo="logfile" final="true"/>
</rules>

2)配置我的Programm.cs

public class Program
{
    public static void Main(string[] args)
    {
        var logger = NLog.Web.NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();

        try
        {
            logger.Debug("init main");
            CreateWebHostBuilder(args).Build().Run();
        }
        catch (Exception ex)
        {
            //NLog: catch setup errors
            logger.Fatal(ex, "Stopped program because of exception");
            throw;
        }
        finally
        {
            // Ensure to flush and stop internal timers/threads before application-exit (Avoid segmentation fault on Linux)
            NLog.LogManager.Shutdown();
        }
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .ConfigureLogging(logging =>
            {
                logging.ClearProviders();
            })
            .UseNLog();
}

3)更改json文件并添加下一个代码:

"Logging": {
    "LogLevel": {
        "Default": "Trace",
        "Microsoft": "Information"
    }
}

4)之后,我在控制器类中创建了私有字段

 private readonly ILogger<UserController> _logger;

    public UserController(ILogger<UserController> logger)
    {
        _logger = logger;
    }

并在try / catch中使用此记录器

 catch (Exception ex)
    {
        _logger.LogWarning(ex, "LOG WARNING HELLOOOO");
        _logger.LogTrace(ex, "LOG TRACE HELLOOOO");
        return StatusCode(500, ex.Message);
    }

但是当我创建错误情况时,我的文件中没有LogTrace信息

  

2019-08-20 19:52:21.9065 INFO执行操作方法AppStore.Web.Controllers.UserController.AddAsync(AppStore.Web)-验证状态:有效   引用

     

2019-08-20 19:52:22.2795警告日志警告hellooo

     

2019-08-20 19:52:22.2817 INFO执行的动作方法   AppStore.Web.Controllers.UserController.AddAsync(AppStore.Web),   返回结果Microsoft.AspNetCore.Mvc.NotFoundObjectResult在   373.2219ms。

为什么我看不到跟踪信息,我在配置中做错了什么或需要做其他实现。我测试了log -error,info,warn,致命的信息,但只有跟踪没有保存在我的文件中。

1 个答案:

答案 0 :(得分:1)

Configure appsettings.json所示:

  

appsettings.json中指定的Logging配置将覆盖任何   调用SetMinimumLevel。因此,请删除“默认”:或对其进行调整   正确地满足您的需求。

{
    "Logging": {
        "LogLevel": {
            "Default": "Trace",
            "Microsoft": "Information"
        }
    }
}
  

请记住也将任何特定于环境的配置更新为   避免任何意外。前appsettings.Development.json

您需要同时更改Loggingappsettings.json中的appsettings.Development.json部分。

对于appsettings.Development.json,您可以选中appsettings.json或打开项目文件夹以进行查找和编辑。