log4net 이란
아파치의 오픈소스 로그 라이브러리로 Java, C++, .NET 등 다양한 언어와 플랫폼을 지원하는 로그 라이브러리의 .NET 버전이다. 로그를 파일, 콘솔화면, DB로 출력할 수 있고 또 날짜, 파일 크기마다 로그를 새로 생성하도록 할 수 있다.
.NET에서 사용하기
.NET의 경우 NuGet을 사용하여 설치한다.
NuGet을 사용하여 log4net 라이브러리를 설치하면 아래 그림처럼 자동으로 프로젝트에 설정된다.
위 상태에서 빌드를 한다. 실행 파일이 있는 위치에 log4net 관련 dll와 xml 파일이 있다.
NuGet으로 설치한 경우 log4net 관련 설정 정보는 app.config 에 기록한다.
로그가 남도록 하면 아래와 같이 로그 파일이 생겨진다.
프로그램 실행 도중 로그 설정 파일을 변경하여 적용하기 위해서는 아래 처럼 AssemblyInfo.cs에 [assembly: log4net.Config.XmlConfigurator(Watch = true)] 을 추가한다.
로그 설정 정보가 있는 app.confog의 예
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<log4net>
<!-- 파일을 사용하는 Appender -->
<appender name="LogToFile" type="log4net.Appender.FileAppender" >
<!-- 만들 로그 파일 -->
<param name="File" value="log-file.txt" />
<!-- 기존에 로그 파일이 있다면 연결해서 사용 여부 -->
<param name="AppendToFile" value="true" />
<!-- 로그 형식 -->
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%date [%thread] %-5level %logger - %message%newline" />
</layout>
</appender>
<!-- 날짜 단위로 Rolling 하는 파일 Appender -->
<appender name="DayRollingLogToFile" type="log4net.Appender.RollingFileAppender">
<!-- 로그 파일 이름의 선두 부분 -->
<File value="LogSample" />
<!-- 기존에 로그 파일이 있다면 연결해서 사용 여부 -->
<appendToFile value="true" />
<!-- 날짜 마다 파일을 작성하는 것을 지정 -->
<rollingStyle value="date" />
<!-- 로그 파일 이름 고정 여부. 고정하지 않을 때는 false -->
<staticLogFileName value="false" />
<!-- 파일 이름에의 날짜 부분 -->
<datePattern value='"."yyyyMMdd".log"' />
<layout type="log4net.Layout.PatternLayout">
<!-- 로그 형식 -->
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
</layout>
</appender>
<!-- 파일 크기 단위로 Rolling 하는 파일 Appender -->
<appender name="SizeRollingLogToFile" type="log4net.Appender.RollingFileAppender">
<file value="mylogfile.txt" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="5" />
<maximumFileSize value="10MB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %level %logger - %message%newline" />
</layout>
</appender>
<!-- 콘솔을 사용하는 Appender -->
<appender name="LogToConsole" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date{ABSOLUTE} [%thread] %level %logger - %message%newline"/>
</layout>
</appender>
<root>
<!-- 로그 레벨 지정. 아래에서는 INFO 레벨 이상만 로그가 남는다 -->
<level value="INFO" />
<!-- 아래 로그 레벨 중 하나 선택
<level value="OFF " />
<level value="FATAL" />
<level value="ERROR" />
<level value="WARN" />
<level value="INFO" />
<level value="DEBUG" />
<level value="ALL" />
-->
<!-- 어느 로그를 사용할 것인지 지정한다. 현재 파일로그와 날짜별 로그 사용 -->
<appender-ref ref="LogToFile" />
<appender-ref ref="DayRollingLogToFile" />
<!-- 복수 지정 가능 -->
</root>
</log4net>
</configuration>
예제 소스 코드
public partial class Form1 : Form
{
private static readonly log4net.ILog log =
log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
log.Info("INFO 출력");
log.Debug("Debug 출력");
log.Error("Error 출력");
}
}
로그 정보에 로그를 남기는 코드 부분의 파일명이나 위치를 남기고 싶은 경우
로그 형식에 %location 을 사용한다.
<param name="ConversionPattern" value="%date [%thread] %-5level %logger - %location %message%newline" />
로그 파일을 특정 폴더에 남기고 싶은경우
현재 실행 파일이 있는 폴더의 Logs 폴더에 남기고 싶은 경우
<log4net>
<!--날짜 단위로 Rolling 하는 파일 Appender-->
<appender name="DayRollingLogToFile" type="log4net.Appender.RollingFileAppender">
<!--로그 파일 이름의 선두 부분-->
<File value="Logs\GameLog" />
로그 설정 정보를 app.config 파일 이외의 파일에 남기고 싶을 때
'AssemblyInfo.cs' 파일에 아래의 코드를 입력한다
[assembly: log4net.Config.DOMConfigurator(ConfigFile = "../../log4net.xml", Watch = true)]
또는
// 로그 설정 파일 로딩 후 적용
string logFilePath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log4net_config.xml");
var finfo = new System.IO.FileInfo(logFilePath);
log4net.Config.XmlConfigurator.ConfigureAndWatch(finfo);
logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
nunit에서 사용할 때 동작하지 않는 경우
Log4Net.config 파일을 만들어서 아래와 같이 만든다.
<?xml version="1.0" encoding="utf-8" ?>
<log4net>
<!-- 필요한 설정 정보 입력 -->
</log4net>
소스에서 위에서 만든 설정 파일을 사용하도록 한다.
[SetUp]
public void RunBeforeAnyTests()
{
string logFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Log4Net.config");
FileInfo finfo = new FileInfo(logFilePath);
log4net.Config.XmlConfigurator.ConfigureAndWatch(finfo);
}
로그를 메일로 보내기
로그 설정 파일에서 log4net.Appender.SmtpAppender 를 사용한다.
보낼 메일의 문지 인코딩은 UTF-8을 사용한다.
로그 메시지 하나마다 메일을 보내는 것이 아니고 하나의 메일에는 복수의 로그 메시지가 있다.
설정 예
<appender name="SmtpAppender" type="log4net.Appender.SmtpAppender">
<!-- 메일을 받을 곳의 주소 -->
<to value="to@domain.com" />
<!-- 메일을 보내는 곳의 주소 -->
<from value="from@domain.com" />
<!-- 제목 -->
<subject value="test logging message" />
<!-- 메일 서버 정보 -->
<smtpHost value="SMTPServer.domain.com" />
<!-- 메일을 보낼 때의 버퍼 사이즈 -->
<bufferSize value="512" />
<lossy value="true" />
<evaluator type="log4net.Core.LevelEvaluator">
<threshold value="WARN"/>
</evaluator>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%newline%date [%thread] %-5level %logger - %message%newline" />
</layout>
</appender>
Filter
특정 appender에서만 로그 레벨을 바꾸고 싶은 경우 <appender> 요소 내에서 <filter> 요소를 추가하여 조정할 수 있다.
로그 레벨을 FATAL 때만 남기고 싶다면 다음과 같이 한다.
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="FATAL" />
<param name="LevelMax" value="FATAL" />
</filter>
로그 파일 로테이션 시 파일크기+날짜 사용하기
<appender name="debugAppender" type="log4net.Appender.RollingFileAppender">
<filter type="log4net.Filter.LevelMatchFilter">
<levelToMatch value="DEBUG" />
</filter>
<filter type="log4net.Filter.DenyAllFilter" />
<File value="Logs\debug.log" />
<PreserveLogFileNameExtension value="true" />
<appendToFile value="true" />
<rollingStyle value="Composite" />
<maximumFileSize value="32MB" />
로그 파일 이름에 날짜 붙이기
<File value="Logs\perf_.log" />
<staticLogFileName value="false" />
<datePattern value="yyyyMMdd-HHmm" />
perf_20140601-1140.log 라는 식으로 로그 파일이 만들어진다.
같은 로그 파일 이름이 있으면 일련 번호 붙이기
파일 사이즈 및 날짜로 로그 파일을 로테이션 할 때 새로 만드는 파일 이름이 이전과 같은 이름이 되어버려서 이전 것을 덮어 쓸 수 있다.
예를들면 파일 사이즈가 설정 값을 넘겨서 새로 만드는데 이전까지 사용한 로그 파일의 생성 날짜가 같은 날이면 지금 새로 만드는 것도 같은 이름이 되어 버린다.
이유는 파일 이름 규칙이 'xx-날짜.log'로 했기 때문이다.
이름 중복을 피하기 위해서 로그 파일 이름에 일련 번호를 붙이도록 한다.
CountDirection 설정을 사용한다. 사용 방법은 아래와 같다.
<File value="Logs\perf_.log" />
<CountDirection value="1" />
이후 로테이션으로 새로 파일을 만들 때 파일 이름이 다음처러 만들어진다.
info_20140612.1.log
info_20140612.2.log
로그 파일 개수 제한
생성된 로그 파일의 최대 개수를 제한 할 수 있다.
<maxSizeRollBackups value="10" />
서식 타입
%literal 리터럴을 표시(「%」을 출력하는 경우 등)
%newline 개행
%logger logger 이름
%class 클래스 이름
%date 실행 시간
%exception 예외 정보
%location 메소드 이름, 행 번호
%line 행 번호
%message 메시지
%method 메소드 이름
%level 로그 레벨
%thread 스레드 ID
%appdomain 실행 파일 이름
%identity 현재 컨텍스트의 유저 이름
(System.Threading.Thread.CurrentPrincipal.Identity.Name 의 값이 설정 되어 있다.)
%username 유저 이름
웹 정보
Log4Net 간단 사용법(Web 포함) http://mvcp.tistory.com/404
log4net을 사용해 보자 http://nalra999.blog.me/110095620129
[ASP.NET] log4net의 설정과 사용법 예제 http://oneprimary.blog.me/30076001926
Apache log4net™ Config Examples http://logging.apache.org/log4net/release/config-examples.html
RECENT COMMENT