[.NET Core] ASP.NET Core 3.1 - NLog 설정 및 사용 방법

728x90
반응형

NLog는 .NET 표준을 포함한 다양한 .NET 플랫폼을 위한 유연한 무료 로깅 플랫폼입니다.

ASP.NET MVC 때 부터 주로 NLog만을 사용해와서, 익숙한 Logging 플랫폼인데요.

.NET Core 를 학습하는 과정에서도 NLog를 사용해서 Logging을 구축하였습니다. 

 

 


1. Nuget Package 다운로드

NLog 를 Nuget Package 관리자에서 검색하시면, 아래 AspNetCore 용 NLog를 발견하실 수 있습니다. 

제가 설치했을때의 최신 버전인 4.9.2 버전을 설치합니다. 

 

 


2. NLog 공식 GitHub

https://github.com/NLog/NLog/wiki/Getting-started-with-ASP.NET-Core-3

 

NLog/NLog

NLog - Advanced and Structured Logging for Various .NET Platforms - NLog/NLog

github.com

NLog 공식 GitHub는 위 사이트 입니다.

해당 사이트에 접속하시면, 어떻게 구성해야 하는지 자세하게 나와 있습니다. 

 


3. nlog.config 파일 생성

사용방식은 기존과 비슷합니다만, ASP.NET Core 에서는 nlog.config 파일을 이용해서 대부분 설정이 가능합니다. 

기본적으로 사용하는 nlog.config 파일이며, 파일 위치 및 이름을 사용자 성향에 맞게 변경하시면 됩니다. 

<?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="Info"
      internalLogFile="c:\temp\internal-nlog.txt">

  <!-- enable asp.net core layout renderers -->
  <extensions>
    <add assembly="NLog.Web.AspNetCore"/>
  </extensions>

  <!-- the targets to write to -->
  <targets>
    <!-- write logs to file  -->
    <target xsi:type="File" name="allfile" fileName="c:\temp\nlog-all-${shortdate}.log"
            layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}" />

    <!-- another file log, only own logs. Uses some ASP.NET core renderers -->
    <target xsi:type="File" name="ownFile-web" fileName="c:\temp\nlog-own-${shortdate}.log"
            layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" />
  </targets>

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

    <!--Skip non-critical Microsoft logs and so log only own logs-->
    <logger name="Microsoft.*" maxlevel="Info" final="true" /> <!-- BlackHole without writeTo -->
    <logger name="*" minlevel="Trace" writeTo="ownFile-web" />
  </rules>
</nlog>

 


4. 출력 디렉터리로 복사 설정

nlog.config 파일의 출력 디렉터리로 복사 메뉴를 새 버전이면 복사 로 설정해줍니다.

기본 설정 사항인걸로 알고 있어서, 따로 설정하실 필요는 없지만, 확인은 해보세요^^

 


5. 로깅 설정

.NET Core 3.1의 경우 Program.cs 파일에서 Logging에 대한 사용을 NLog로 설정합니다. 

 

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.ConfigureLogging(logging =>
            {
                logging.ClearProviders();
            }).UseNLog();
            webBuilder.UseStartup<Startup>();
        });

 

위와 같이 설정할 경우 각 Controller에서 정의된 logger에 기본적으로 NLog 로 설정 됩니다. 

private readonly ILogger<GroupController> _logger;

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

 

 

logger를 별도로 정의해서 사용하시려면, 아래와 같이 사용 할 수 있습니다. 

var logger = NLog.Web.NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();
try
{
    logger.Debug("init main");
    CreateHostBuilder(args).Build().Run();
}
catch (Exception exception)
{
    //NLog: catch setup errors
    logger.Error(exception, "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();
}

 

 


줄맞춤 TIP

18.12.2013 11:23:14,834 | INFO | this is an info
18.12.2013 11:23:14,835 | TRACE | this is a trace
18.12.2013 11:23:14,834 | INFO  | this is an info
18.12.2013 11:23:14,835 | TRACE | this is a trace

Level 을 로그에 찍을때 위와 같이 개수문제로 인해서 안이쁘게 보여지는데요.

 

layout="${uppercase:${level}:padding=-5}

padding=-5 와 같이 자리수를 같이 넣으면 5칸으로 보기 좋게 맞춰집니다.

참고하세요

 

 

https://stackoverflow.com/questions/20655755/nlog-format-loglevel-with-whitespaces

 

NLog: Format loglevel with Whitespaces

I am using NLog for logging. Currently my Layout-String is: "${date:format=dd.MM.yyyy HH\\:mm\\:ss,fff} | ${level:uppercase=true} | ${message}" This results in the following Logs: 18.12.2013 11...

stackoverflow.com

 

 

 

 

 

 

 

728x90