JHyeok

ASP.NET Core에서 로그 라이브러리 NLog 적용하기

August 11, 2019☕️ 3 min read

ASP.NET Core에서 로그 라이브러리 NLog 적용하기

NLog는 닷넷 플랫폼 로그 라이브러리이다. 옵션들을 이용해서 다양한 레벨에서 로그를 남길 수 있다. 이번 ASP.NET Core MVC 시리즈에서는 NLog를 적용하는 방법을 알아본다.

ASP.NET MVC 5에서 NLog를 적용하는 방법과는 다르게 ASP.NET Core 2.2에서는 정말 간단하게 적용할 수 있다.

Nuget에서 NLog.Web.AspNetCore를 다운로드한다.

프로그램 진입점인 Program 클래스의 Main에다가 아래처럼 코드를 작성한다.

public static void Main(string[] args)
{
    var logger = NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();
    try
    {
        logger.Debug("Init Main");
        CreateWebHostBuilder(args).Build().Run();
    }
    catch (Exception ex)
    {
        logger.Error(ex, "Stopped program because of exception");
        throw;
    }
    finally
    {
        NLog.LogManager.Shutdown();
    }
}

그리고 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" >
  <extensions>
    <add assembly="NLog.Web.AspNetCore"/>
  </extensions>

  <targets>
    <target name="file" type="File"  fileName="${basedir}/Logs/${level}/${shortdate}.txt" layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}" />
  </targets>
  <rules>
    <logger name="*" minLevel="Error" writeTo="file" />
  </rules>
</nlog>

로깅할 최소 레벨을 설정이 가능한데, Trace로 하면 모든 오류를 다 쌓고, Error로 설정하면 Error위의 레벨만 쌓는다.

자세한 로그 레벨 정보는 여기서 확인이 가능하다.

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

CreateWebHostBuilder에다가 UseNLog()로 주입을 시킨다. 이러면 NLog설정이 끝난다. 오류가 발생한다면 NLog.config에 정의해놓은 targetrule에 맞추어서 파일이 만들어진다.

짧은 시간 안에 ASP.NET Core에서 오류 라이브러리인 NLog를 적용하였다.

nlog2 nlog1

NLog.config에 설정해놓은 fileName, layout에 맞게 파일이 생성된 것을 확인 할 수 있다.

NLog와 Slack 연동

<?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" >
  
  <extensions>
    <add assembly="NLog.Slack" />
  </extensions>
  
  <targets>
    <target name="Slack" xsi:type="Slack" layout="${message}" webHookUrl="" channel="#ft_batch_error" username="ft_batch_bot" compact="false" icon=":ghost:" />
  </targets>
  
  <rules>
    <logger name="*" minlevel="Error" writeTo="Slack" />
  </rules>
</nlog>

extensions에 NLog.Slack을 추가해주어야 한다. Nuget에서 설치를 하면 되며, targets에 Slack설정을 추가해주며 rules에도 추가해주면 오류가 발생하면 아래 사진처럼 봇이 Slack 메시지로 오류가 났음을 알려준다.

log-slack

주의할 점

NLog.Config이 잘못되면 NLog가 쌓이지 않을 수 있다.
필자는 운영서버에서는 Slack을 적용하고, QA서버에서 Slack을 제거해야 해서, Config을 수정해야 할 일이 생겼다. QA서버에서 targets에서 Slack을 제거했는데, 파일 탐색기에 NLog가 쌓이지 않게 되었다.
그런데 NLog를 다시 수정 전으로 돌리면 파일이 쌓이는 아이러니한 상황이 생겨서 잘 살펴보았더니, targets에는 제거가 되어있는데, rules에서는 남아있어서 생긴 문제였다.

target name="Slack"을 지워줬으면 rules에서도 Slack에 해당되는 rules을 지워주어야 한다. 그 이후 잘 쌓이게 되었다.


Reference

https://github.com/NLog

https://www.nuget.org/packages/NLog.Web.AspNetCore/4.8.3

https://github.com/NLog/NLog/wiki/Configuration-file#log-levels


JHyeok

Written by JaeHyeok Kim
Github

© 2019 - 2020, Built with Gatsby