안녕하세요. 명월입니다.
이 글은 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)에 대한 글이었습니다.
궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.
'Development note > C#' 카테고리의 다른 글
[C#] 비동기 소켓 통신(IOCP) - EAP 패턴 (36) | 2020.01.31 |
---|---|
[C#] MVC Framework에서 WebSocket을 사용하는 방법(SignalR) (0) | 2019.11.29 |
[C#] ASP.NET의 MVC Framework에서 DI 의존성 주입을 하는 방법 (0) | 2019.11.28 |
[C#] dynamic타입의 동적 파라미터 - DynamicObject (WinForm에서 ASP.MVC의 ViewBag 오브젝트를 사용하는 방법) (0) | 2019.11.25 |
[C#] 날짜 포맷 (2) | 2019.08.06 |
[C#] 숫자 포맷 (돈 표시 및 소수점 이하 표시) (0) | 2019.08.05 |
[C#] XML를 XPath를 이용해서 다루는 방법 (0) | 2019.08.02 |
[C#] Reflection를 이용한 클래스 복제 (0) | 2019.07.12 |