[C#] 로그 라이브러리(log4net)


Development note/C#  2019. 8. 23. 19:23

안녕하세요. 명월입니다.


이 글은 C#에서 사용하는 로그 라이브러리(log4net)에 대한 글입니다.


프로그램를 개발할 때는 보통 Visual studio등의 IDE 툴을 사용해서 디버깅등을 통해 프로그램의 흐름을 알 수 있습니다. 그래서 개발 중에 에러가 발생하거나 잘못된 결과가 나올 때는 디버깅을 추적하여 값을 수정할 수 있습니다.

개발이 끝나고 Production에 컴파일 된 파일을 올려서 운영 중에 있을 때도 버그가 발생할 수 있습니다. 이 때는 웹서비스의 경우는 IIS를 일반 서비스 프로그램을 사용할 경우에는 IDE툴을 이용하는 것이 아니기 때문에 그 에러를 추적하기가 힘듭니다.


그래서 할 수 있는 방법중에 로그를 기록을 남겨서 프로그램의 흐름을 기록하는데요. 문제가 생겼을 때 그 로그를 추적해서 에러를 예측하거나 찾아낼 수 있습니다.

그 밖에도 로그를 통해서 유저의 행동 형식의 추적이나 습관, 학습등들의 통계자료로도 사용 가능합니다.


C#에서는 로그를 작성해 주는 라이브러리가 두개 존재합니다. 대표적으로 Elmah가 있고 Log4net이 있습니다. Elmah도 꽤 많은 서비스에서 사용하는 것 같습니다만 개인적으로 Log4net을 선호합니다.

이유는 Log4net은 일단 Log4j, Log4Php 등으로 다른 언어에서도 사용되는 라이브러리고 그렇게 호환성이 큰 라이브러리 만큼 커뮤니티도 커서 많은 정보를 쉽게 얻을 수 있기 때문에 선호합니다.


그럼 Log4net을 사용하기 위해서 Nuget을 이용해 Log4Net을 연결합니다.

using System;
using log4net;
using log4net.Config;
using log4net.Appender;
using log4net.Layout;
using log4net.Repository.Hierarchy;

namespace Example
{
  class Program
  {
    static void Main(string[] args)
    {
      new Program();
      Console.WriteLine("Press Any Key...");
      Console.ReadKey();
    }
    public Program()
    {
      // 로그 매니져 세팅
      var repository = LogManager.GetRepository();
      repository.Configured = true;

      // 콘솔 로그 패턴 설정
      var consoleAppender = new ConsoleAppender();
      consoleAppender.Name = "Console";
      // 로그 패턴
      consoleAppender.Layout = new PatternLayout("%d [%t] %-5p %c - %m%n");

      // 파일 로그 패턴 설정
      var rollingAppender = new RollingFileAppender();
      rollingAppender.Name = "RollingFile";
      // 시스템이 기동되면 파일을 추가해서 할 것인가? 새로 작성할 것인가?
      rollingAppender.AppendToFile = true;
      rollingAppender.DatePattern = "-yyyy-MM-dd";
      // 로그 파일 설정
      rollingAppender.File = @"d:\work\test.log";
      // 파일 단위는 날짜 단위인 것인가, 파일 사이즈인가?
      rollingAppender.RollingStyle = RollingFileAppender.RollingMode.Date;
      // 로그 패턴
      rollingAppender.Layout = new PatternLayout("%d [%t] %-5p %c - %m%n");

      var hierarchy = (Hierarchy)repository;
      hierarchy.Root.AddAppender(consoleAppender);
      hierarchy.Root.AddAppender(rollingAppender);
      rollingAppender.ActivateOptions();
      // 로그 출력 설정 All 이면 모든 설정이 되고 Info 이면 최하 레벨 Info 위가 설정됩니다.
      hierarchy.Root.Level = log4net.Core.Level.All;

      ILog logger = LogManager.GetLogger(this.GetType());

      // 로그 레벨 순위 입니다.
      logger.Fatal("fatal log");
      logger.Error("error log");
      logger.Warn("warn log");
      logger.Info("info log");
      logger.Debug("debug log");
      
      //위에서 Info로 설정하게 되면 Fatal, Error, Warn, Info만 표시되고 Debug는 표지되지 않습ㄴ디ㅏ.
    }
  }
}

위 패턴 레이아웃을 확인하면 패턴식이 따로 있는 것을 확인 할 수 있습니다.

사실 패턴 레이아웃식에 대해서 자세히 설명하고 싶기는 합니다만, 별로 크게 중요하지 않고 특별한 것 없으면 「%d [%t] %-5p %c - %m%n」 식이 무난합니다. 만약 더 자세한 내용을 넣고 싶으면 아래의 링크를 참조하세요.

링크 - https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html


여기까지 왔으면 로그를 사용할 수 있는데, 이게 실제 Production에 릴리즈가 된다고 하면 데이터가 소스에 들어가 있어서 설정할 수 없습니다. 뭐 파라미터로 설정할 수 있기는 하지만 로그 파일 설정을 따로 빼야 할 때도 있습니다.

using System;
using log4net;
using log4net.Config;
using System.IO;

namespace Example
{
  class Program
  {
    static void Main(string[] args)
    {
      new Program();
      Console.WriteLine("Press Any Key...");
      Console.ReadKey();
    }
    public Program()
    {
      // xml이 있는 패스 경로
      String logPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Log4Net.xml"); ;
      // Fileinfo로 변환하고
      FileInfo file = new FileInfo(logPath);
      // LogManager에 주입한다.
      XmlConfigurator.Configure(file);

      ILog logger = LogManager.GetLogger(this.GetType());

      logger.Fatal("fatal log");
      logger.Error("error log");
      logger.Warn("warn log");
      logger.Info("info log");
      logger.Debug("debug log");
    }
  }
}

위에서 보면 xml 파일을 Fileinfo로 읽어 와서 XmlConfigurator.Configure를 사용하면 설정할 수 있습니다.

<?xml version="1.0" encoding="utf-8" ?>
<log4net>
  <!-- 콘솔 로그 설정 -->
  <appender name="Console" type="log4net.Appender.ConsoleAppender">
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%d [%t] %-5p %c - %m%n" />
    </layout>
  </appender>
  <!-- 파일 로그 설정 -->
  <appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
    <file value="d:\work\test.log" />
    <appendToFile value="true" />
    <datePattern value="-yyyy-MM-dd" />
    <rollingStyle value="Date" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%d [%t] %-5p %c - %m%n" />
    </layout>
  </appender>
  <!-- 로그 레벨 설정 -->
  <root>
    <level value="ALL" />
    <appender-ref ref="Console" />
    <appender-ref ref="RollingFile" />
  </root>
</log4net>

설정은 위 소스에서 만든 것과 같기 때문에 같은 결과가 나옵니다.


저는 ConsoleAppender와 RollingFileAppender만 사용했지만 제공하는 Appender가 굉장히 많습니다. (너무 많아서 다 설명할 수가 없네요.. 혹시 다른 Appender예제가 필요하시면 댓글 달아주세요...)

참조 - https://logging.apache.org/log4net/release/manual/introduction.html

위 참조페이지를 보시면 디비-Appender부터 메일-Appender(에러가 나오면 메일 보낼 수 있게..), 메모리-Appender, Socket-Appender등등 매우 많네요. 필요한게 있으면 위에 소스 혹은 XML에 추가해서 사용하면 됩니다.

참조 - https://logging.apache.org/log4net/release/manual/configuration.html


여기까지 C#에서 사용하는 로그 라이브러리(log4net)에 대한 글이었습니다.


궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.