- log4net은 콘솔,파일,데이터베이스,메일 등 여러 곳에 로그를 출력시킬 수 있으며 로그 레벨을 지정 하여 로그 레별별로 출력을 제어 하며 각각의 출력 타겟을 appender로 지정한다.
- 예제는 .net7 blazor 서버사이드 기준으로 작성.
- log4net.config 파일 생성. log4net 설정 파일 (파일명은 임의 지정 가능. 프로그램에서 호출시에 파일명을 맞춰서 바꿔줘야 함.)
■ 대표적인 [어펜더(Appender)]
ADONetAppender
데이터베이스의 보존하기위해, 복수의 AP서버가 있는 경우에는 일관관리가 가능한 메리트가 있다.
그러나,DB접속이 안될때는 SMTPAppender와 함께써서 장해통보를 할 필요가 있다.
ConsoleAppender
콘솔에 출력을 하는 표준 Appender이다.
EventLogAppender
이벤트뷰어라고 하는 Windows에 속해있는 이벤트로그 감시화면에 application로그를 출력한다.
FileAppender
파일에 로그를 출력한다. 간단하지만 파일크기가 너무 크게 될 가능성이 있기 때문에 RollingFileAppender를 사용하는 것을 추천한다.
NetSendAppender
Messenger서비스에 동작하는 NetSend명령을 사용해서, 장해를 직접적으로 사용자에게 통지하는 것이 가능하다.
RollingFileAppender
파일의 로그를 출력한다. 파일크기와 시각에 의해 자동적으로 로그파일을 분활하는 것이 가능해, 이용이 많은 Appender이다.
SMTPAppender
메일송신을 한다. TO에 복수지정이 되지만,CC와 BCC의 지정이 되지않는다.
UdpAppender
UDP(user Datagram Protocol)에 로그를 출력한다. UDP 수신처는 log4j의 로그뷰어인 Chainsaw 등을 지정할 수 있다.
ASPNetTraceAppender
ASP에서 사용 가능한 Appender이다.
■로그에 출력하는 메서드
logger.Fatal("log4net에의한출력예~Fatal(치명적장해)");
logger.Error("log4net에의한출력예~Error(장해)");
logger.Warn("log4net에의한출력예~Warn(경고");
logger.Info("log4net에의한출력예~Info(정보)");
logger.Debug("log4net에의한출력예~Degug(디버그트레이스용)");
레벨 | 표준적인 사용분류 |
---|---|
Fatal | 시스템 정지에 해당하는 치명적 장해 |
Error | 시스템이 정지하지는 않지만, 문제가 되는 장해 |
Warn | 장해가 아닌 주의경고 |
Info | 동작로그등의 정보 |
Debug | 개발용 디버그 메시지 |
■PatternLayout으로 지정가능한 패턴
패턴 | 설명 |
---|---|
%c | 로그출력이 된 logger명을 출력 |
%C | Class를 출력 |
%d | 일시를 출력. 「%d{yyyy/mm/dd HH:mm:ss}」와 같은 상세설정도 가능 |
%F | 파일명을 출력 |
%l | 소스명이나행과 같은 호출한 위치를 출력 |
%L | 행번호를 출력 |
%m | 메시지를 출력 |
%M | 메서드명을 출력 |
%n | 개행문자를 출력 |
%p | 로그의 레벨(Fatal/Error등)을 출력 |
%t | 로그를 생성한 쓰레드를 출력 |
%x | 쓰레드의 NDC(네스트화 진단 컨텍스트)를 출력.쓰레드고유의 정보(session ID등)을 밀어넣는것이 가능 |
단, %C、%F、%l、%L、%M 의 경우는 처리부하가 높아지기 때문에 필요할 때 이외는 사용하지 않도록 주의가 필요.
또한, Layout에는 SimpleLayout,XmlLayout등의 몇 개의 종류가 있기는 하지만, 대부분의 경우, 로그 정리가 간단한 PatternLayout을 사용한다.
1. 패키지 관리자 콘솔
`Install-Package log4net`입력 하여 nuget 패키지에서 패키지 설치
2. ui 설치
nuget 패키지 에서 Log4net을 검색해서 설치.
- 출력할 appender를 생성 후 rrot 에 appender-ref를 지정 해줘야 해당 appender로 로그가 출력됨.
- ConsoleAppender 로그 1개, RollingFileAppender 2개 생성.
ConsoleAppender은 console로 로그가 출력되며 RollingFileAppender는 파일로 출력이 되며 설정에 따라 파일 용량 설정 후 설정 용량 초과시 log + 1.log 파일로 새로 생성되거나 오래된 파일은 자동 삭제할 수 있는기능을 가짐.- 전체적인 로그를 InfoLog로 출력함.
그중 error 로그를 추가로 ErrorLog로 출력 해줌. InfoLog에는 모든 로그를 출력 하게 만들어서 error 로그만 보고싶을때 보기 힘들기 때문에 ErrorLog를 추가 해줌.
<?xml version="1.0" encoding="utf-8" ?>
<log4net watch="true">
<root>
<level value="ALL" />
<appender-ref ref="InfoLog" />
<appender-ref ref="ErrorLog" />
<appender-ref ref="ConsoleLog" />
</root>
<!-- Info 로그를 위한 설정 --><!--
<logger name="InfoLogger">
<level value="ALL" />
<appender-ref ref="InfoLog" />
</logger>-->
<appender name="InfoLog" type="log4net.Appender.RollingFileAppender">
<file value="logs/" />
<staticLogFileName value="false"/>
<datePattern value="'InfoLog'/yyyy/MM/dd'.log'"/>
<rollingStyle value="Date" />
<appendToFile value="true" />
<maxSizeRollBackups value="6" />
<maximumFileSize value="500MB" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date | %-5level | %logger | %method : %message%newline" />
</layout>
</appender>
<!-- ERROR 로그를 위한 설정 --><!--
<logger name="ErrorLogger">
<level value="ERROR" />
<appender-ref ref="ErrorLog" />
</logger>-->
<appender name="ErrorLog" type="log4net.Appender.RollingFileAppender">
<file value="logs/" />
<staticLogFileName value="false"/>
<datePattern value="ErrorLog/yyyy/MM/dd'.log'"/>
<rollingStyle value="Date" />
<appendToFile value="true" />
<maxSizeRollBackups value="6" />
<maximumFileSize value="500MB" />
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="ERROR" />
<levelMax value="ERROR" />
</filter>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date | %-5level | %logger | %method : %message%newline" />
</layout>
</appender>
<appender name="ConsoleLog" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date | %-5level | %logger.%method : %message%newline" />
</layout>
</appender>
</log4net>
- Program.cs 에서
log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo("log4net.config"));
추가. log4net.config은 본인이 만든 config 명으로 대체.- 로그관리를 하려는 프로그램 파일에 아래 코드 추가.
private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType
현재 클래스명이 출력됨.- index페이지에서 간단하게 구현.
<!-- Fullscreen.razor -->
@page "/"
@using System.Reflection;
@inject IJSRuntime JSRuntime
<input type="button" @onclick="test" value="test"></input>
@code {
private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
// protected override async Task OnInitializedAsync()
// {
// await JSRuntime.InvokeVoidAsync("enterFullscreen", File.ReadAllText("wwwroot/css/fullscreen.js"));
// }
protected override async Task OnAfterRenderAsync(bool firstRender)
{
log.Info($"메소드 명 : {MethodBase.GetCurrentMethod().Name} This is an info message");
if (firstRender)
{
// await JSRuntime.InvokeVoidAsync("enterFullscreen", File.ReadAllText("wwwroot/css/fullscreen.js"));
testMethode();
}
// await JSRuntime.InvokeVoidAsync("enterFullscreen", File.ReadAllText("wwwroot/css/fullscreen.js"));
}
public void testMethode()
{
log.Debug($"메소드 명 : {MethodBase.GetCurrentMethod().Name} This is an info message");
LogDaDaDaDaHaHaHa();
}
public void LogDaDaDaDaHaHaHa()
{
log.Error($"메소드 명 : {MethodBase.GetCurrentMethod().Name} This is an info message");
}
protected async void test()
{
await JSRuntime.InvokeVoidAsync("enterFullscreen", File.ReadAllText("wwwroot/css/fullscreen.js"));
}
public void ThreadLogDeleteTest()
{
}
}
로그파일
Info 파일
error 파일.
위에서 보듯 console과 InfoLog에는 출력레벨이 지정 해 주지 않아 All로 모든 로그가 출력됬고 Error는 appender에서 로그 레벨을 지정해 줘서
Error로그만 출력된것을 확인할 수 있습니다.
출처
출처사이트