12
votes

ASPNET Core 2.0 with latest Nlog.

All config files load correctly.

My config file is simple, I just want it to log every thing.

<?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="Warn"
      internalLogFile="C:\wwwLogs\nlog.log">

  <extensions>
    <add assembly="NLog.Web.AspNetCore"/>
  </extensions>

  <targets>
    <target xsi:type="File" name="allfile" fileName="C:\wwwLogs\${shortdate}.log"
            maxArchiveFiles="90"
            archiveNumbering="DateAndSequence"
            archiveAboveSize="250000"
            archiveFileName="archive/log.{#######}.log"
            archiveEvery="Day"
            concurrentWrites="true"
            layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" />
  </targets>

  <rules>
    <!--All logs, including from Microsoft-->
    <logger name="*" minlevel="Trace" writeTo="allfile" />
  </rules>
</nlog>

I can see it in the trace log for nlog it is setting all levels to the correct output.

2017-11-01 14:21:26.3017 Trace Opening C:\wwwLogs\2017-11-01.log with allowFileSharedWriting=False
2017-11-01 14:21:28.5859 Debug Targets for TimeSlotApprovalService by level:
2017-11-01 14:21:28.5859 Debug Trace => allfile
2017-11-01 14:21:28.5859 Debug Debug => allfile
2017-11-01 14:21:28.5859 Debug Info => allfile
2017-11-01 14:21:28.5859 Debug Warn => allfile
2017-11-01 14:21:28.5859 Debug Error => allfile
2017-11-01 14:21:28.5859 Debug Fatal => allfile

In my application when I call this

_logger.LogDebug(JsonConvert.SerializeObject(resultList, Formatting.Indented));
_logger.LogError(JsonConvert.SerializeObject(resultList, Formatting.Indented));
_logger.LogCritical(JsonConvert.SerializeObject(resultList, Formatting.Indented));
_logger.LogWarning(JsonConvert.SerializeObject(resultList, Formatting.Indented));
_logger.LogTrace(JsonConvert.SerializeObject(rankedTimeSlots, Formatting.Indented));

Then the log file only logs these

2017-11-01 14:44:48.2570|TimeSlotApprovalService|**ERROR**|[json...

2017-11-01 14:44:48.2570|TimeSlotApprovalService|**FATAL**|[json...

2017-11-01 14:44:48.2570|TimeSlotApprovalService|**WARN**|[json...

Where are the rest?? Trace and Debug?? Info?

2
How did you register NLog with ASP.NET Core? You will have to adjust your logging configuration on appsettings.json to include Trace logs (it may default to Information). - poke
Oh ... my... god. :D I did not know about that! That is the problem. Convert your comment to an answer. I just never realised there was ANOTHER setting.. nLog documentation does not mention that anywhere in their docs and I went through it several times. - Piotr Kula

2 Answers

26
votes

ASP.NET Core and its logging system Microsoft.Extensions.Logging use a central configuration. This configuration applies regardless of the attached logging providers. So if you use NLog as a logging provider, you will still have to configure the logging infrastructure.

By default, the web host builder will automatically use the configuration within the appsettings.json to configure the logging verbosity. And in the default template, this is what the configuration looks like:

{
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Warning"
    }
  }
}

So the default minimum log level to log is Warning. So even if you configure your NLog provider to log at any logging level, it won’t actually receive logging instructions lower than Warning from the logging system.

So you will have to adjust the configuration there to change it. Set it to Trace and it should log everything.

Note that you should still consider using the configuration there as the source of truth on what log levels should be logged. So just keep your NLog configuration to log whatever it gets, and then adjust your appsettings.json to match whatever you want to actually log, depending on the current enviroment (you can create files like appsettings.Development.json and appsettings.Production.json to create environment-specific configurations).

5
votes

If you want to do it by code:

        var services = new ServiceCollection();
        services.AddLogging((builder) => builder.SetMinimumLevel(LogLevel.Trace));