Log4net 사용법

코찔찔이·2023년 10월 12일
0

Blazor

목록 보기
1/1

log4net

  1. log4net은 콘솔,파일,데이터베이스,메일 등 여러 곳에 로그를 출력시킬 수 있으며 로그 레벨을 지정 하여 로그 레별별로 출력을 제어 하며 각각의 출력 타겟을 appender로 지정한다.
  2. 예제는 .net7 blazor 서버사이드 기준으로 작성.
  3. 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명을 출력
%CClass를 출력
%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. log4net Package 설치

1. 패키지 관리자 콘솔 
    `Install-Package log4net`입력 하여 nuget 패키지에서 패키지 설치
2. ui 설치
    nuget 패키지 에서 Log4net을 검색해서 설치.

2. 설정파일 log4net.config 파일 생성

  1. 출력할 appender를 생성 후 rrot 에 appender-ref를 지정 해줘야 해당 appender로 로그가 출력됨.
  2. ConsoleAppender 로그 1개, RollingFileAppender 2개 생성.
    ConsoleAppender은 console로 로그가 출력되며 RollingFileAppender는 파일로 출력이 되며 설정에 따라 파일 용량 설정 후 설정 용량 초과시 log + 1.log 파일로 새로 생성되거나 오래된 파일은 자동 삭제할 수 있는기능을 가짐.
  3. 전체적인 로그를 InfoLog로 출력함.
    그중 error 로그를 추가로 ErrorLog로 출력 해줌. InfoLog에는 모든 로그를 출력 하게 만들어서 error 로그만 보고싶을때 보기 힘들기 때문에 ErrorLog를 추가 해줌.
  • RollingFileAppender
  1. rollingStyle = Size
    • 최대 파일 사이즈를 지정 하고 파일의 사이즈가 지정 사이즈까지 도달 하면 롤링 되어 새로운 파일을 생성하고 해당 파일에 로그를 출력.
      maxSizeRollBackups 옵션을 통해 최대 롤링 회수가 넘어가면 오래된 파일부터 삭제됨.
  2. rollingStyle = Date
    • 날짜 기준으로 파일을 생성하고 동일하게 최대 사이즈가 넘어가면 파일이 롤링되며
      Size와 동일하게 maxSizeRollBackups 옵션을 통해 최대 롤링 횟수가 넘어가면 오래된 파일 삭제가 됨. 단, 해당 옵션은 같은 날짜에 max롤링 갯수를 넘어가면 자동으로 파일 삭제가 진행됨. 일정 날짜 이전의 파일 삭제를 원하면 로직을 따로 구현 해야함.
      예) 10일 이전의 로그는 삭제 하길 원하면 10일 이전 파일은 삭제하는 로직을 따로 코드로 구현 필요.
  3. layout : 출력되는 로그의 pattern을 지정.
  4. file : 파일명.
  5. datePattern : rollung을 Date로 했을때 파일명 패턴을 지정. 특정 문자는 날짜 포맷 형식에 사용되므로 문자로 표출을 원하면 ''로 감싸줘야 함.
    예)파일명을 InfoLog로 출력 하고 싶은데 f는 초를 나타내므로 'InfoLog'감싸지 않으면 출력파일명이 In0oLog로 중간에 파일 생성되는 시점의 시간이 f 자리에 오게됨.
  6. maxSizeRollBackups : 롤링 최대 파일 개수
  7. maximumFileSize : 파일 최대 용량
  8. filter : 에러appender에만 추가를 했으며 로그 출력 레벨을 지정.
  • log4net.config
<?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>

3.코드 구현.(blazor .net7)

  1. Program.cs 에서 log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo("log4net.config")); 추가. log4net.config은 본인이 만든 config 명으로 대체.
  2. 로그관리를 하려는 프로그램 파일에 아래 코드 추가.
    private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType 현재 클래스명이 출력됨.
  3. 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()
    {
        
    }
}
  1. 콘솔 출력 로그
  1. 로그파일

    1. Info 파일

    2. error 파일.

위에서 보듯 console과 InfoLog에는 출력레벨이 지정 해 주지 않아 All로 모든 로그가 출력됬고 Error는 appender에서 로그 레벨을 지정해 줘서
Error로그만 출력된것을 확인할 수 있습니다.

출처
출처사이트

0개의 댓글