IT/development

[전자정부프레임워크/egovframework] log4j 2 설정(log4j2.xml 등)

알 수 없는 사용자 2022. 11. 24. 06:49
반응형

목차

    egovframework log4j 2 설정🧑

    log4j 2는 기존 Properties 파일 형식의 환경 설정을 지원하지 않으며, XML(log4j2.xml) 혹은 JSON(log4j2.json or log4j2.jsn) 파일 형식의 환경 설정만 가능하다.

     

    Log4j2 xml configuration👧

    Xml 파일(log4j 2.xml)을 작성하고, WEB-INF/classes 하위에 포함 될 수 있도록 위치시킴

    Log4j 2가 초기화될 때 자동으로 위 설정 파일을 읽음.

     

    XML 파일 정의

    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration>
     
     <!-- Appender, Layout 설정 -->
     <Appenders>
      <Console name="console" target="SYSTEM_OUT">
       <PatternLayout/>
      </Console>
      <!-- 로그를 파일로 남김-->
      <File name="file" fileName="./logs/file/sample.log" append="false">
       <PatternLayout pattern="%d %5p [%c] %m%n"/>
      </File>
     </Appenders>
     
     <!-- Logger 설정 -->
     <Loggers>
      <Logger name="egovLogger" level="DEBUG" additivity="false">
       <AppenderRef ref="console"/>
       <AppenderRef ref="file"/>
      </Logger>
      <Rootlevel="ERROR">
       <AppenderRef ref="console"/>
      </Root>
     </Loggers>
     
    </Configuration>

    Logger 설정👩‍🦰

    Logger는 로깅 작업을 수행하는 Log4j 주체로, Logger 설정을 제외한 모든 로깅 기능이 이 Logger를 통해 처리됨.

    개발자는 어플리케이션 내에서 사용할 Logger를 정의해야 하며, Log Level과 Appender 설정에 따라 출력 대상과 위치가 결정됨

    Logger 선언과 정의

    Root Logger를 포함한 모든 Logger는 상위 요소인 <Loggers> 아래에 선언해야 함.

    <Loggers>
      <Logger>...</Logger>
      <Root>...</Root>
     </Loggers>

    Root Logger는 <Root> 요소로, 일반 Logger는 <Logger> 요소로 분류해서 정의한다.
    Logger는 하나 이상 정의할 수 있으며, Root 요소를 반드시 정의해야한다.

     <Loggers>
      <!-- attribute: name(Logger명), level(Log Level), additivity(중복로깅여부, true or false) -->
      <!-- element: AppenderRef(Appender명) -->
      <Logger name="X.Y" level="INFO" additivity="false">
       <AppenderRef ref="console"/>  
      </Logger>
      <Logger name="X" level="DEBUG" additivity="false">
       <AppenderRef ref="console"/>  
      </Logger>
      <Rootlevel="ERROR">
       <AppenderRef ref="console"/>
      </Root>
     </Loggers>

    위에서 AppenderRef 요소에 지정한 "console" Appender가 없는 경우, 정상적인 로깅이 수행될 수 없음.

     

    Logger 호출

    Logger는 코드 내에서 다음과 같은 방법으로 호출할 수 있음.

      // 예시
      package egovframe.sample;
     
      import org.apache.logging.log4j.LogManager;
      import org.apache.logging.log4j.Logger;
     
      public class LoggerTest {
     
       // (1) Logger Name이 "egovframe.sample.LoggerTest"인 Logger 설정을 따르는 Logger 객체 생성
       Logger logger1 = LogManager.getLogger();     
       // (2) 위와 동일             
       Logger logger2 = LogManager.getLogger(LoggerTest.class);  
       // (3) Logger Name이 "X"인 Logger설정을 따르는 Logger 객체 생성
       Logger logger3 = LogManager.getLogger("X");   
     
      }

    (1), (2)과 같이 Logger Name에 해당하는 Logger가 설정 파일(log4j2.xml)에 없는 경우, 다음 Logger Hierarchy 규칙에 따라 결정된다.
    결과적으로 (1), (2)에서 생성된 Logger 객체는 Root Logger 설정을 따른다.

     

    Logger Hierarchy

    사용자가 호출한 Logger 객체가 어떤 설정을 따르는지 이해하기 위해서는 Logger Hierarchy를 알고 있어야 한다.
    내부적으로 설정 파일에 정의된 각 Logger 설정에 따라 LoggerConfig 오브젝트가 생성되며,
    Logger Name에 따라 오브젝트 간 부모-자식 관계가 성립한다. 즉 부모 Logger의 설정을 자식 Logger가 상속받는다.
    예를 들어 “X.Y” Logger의 부모는 “X”이고, “X” Logger의 부모는 Root Logger(최상위)이다.

    다음은 Hierarchy 규칙과 예시이다.

    1) 호출한 Logger Name과 동일한 Logger가 있는 경우, 해당 Logger 설정을 따른다.
    2) 동일한 Logger는 없지만, Parent Logger가 존재하는 경우, Parent Logger 설정을 따른다.
    3) Parent Logger도 존재하지 않는 경우, Root Logger 설정을 따른다.

     

    log level

    Log4j 2는 FATAL, ERROR, WARN, INFO, DEBUG, TRACE의 Log Level을 제공함.
    각각 trace(), debug(), info(), warn(), error(), fatal()라는 로깅 메서드를 이용해 로그를 출력할 수 있다.
    로그 레벨은 다음과 같다. (FATAL > ERROR > WARN > INFO > DEBUG > TRACE)

     

    어플리케이션 수행 중 Log Level을 변경할 수도 있는데 이 때 Logger Configuration을 변경하는 것이므로, Logger 설정 정보를 참조하는 메서드를 호출할 수 있도록 org.apache.logging.log4j.Logger를 org.apache.logging.log4j.core.Logger로 캐스팅해야 한다.

    Log Level 변경하려면 변경할 Level값을 파라미터로 setLevel() 메서드를 호출한다.
    setLevel() 호출 이후부터 Log Level이 변경되며, 지정된 로그레벨 이하의 Log Event는 무시된다.

    // 예시
    package egovframe.sample;
     
     import org.apache.logging.log4j.LogManager;
     import org.apache.logging.log4j.Logger;
     
     public class LoggerTest {
      Logger logger = LogManager.getLogger(); // Root Logger 설정을 따름, Log Level: ERROR
      org.apache.logging.log4j.core.Logger targetLogger = (org.apache.logging.log4j.core.Logger) logger;
     
      targetLogger.debug("변경 전 - debug"); // 출력됨
      targetLogger.error("변경 전 - error"); // 출력 안됨
     
     
      targetLogger.setLevel(Level.DEBUG); // DEBUG, INFO, WARN, ERROR, FATAL 출력 가능
      targetLogger.debug("변경 후 - debug"); // 출력됨
      targetLogger.error("변경 후 - error"); // 출력됨	
    }

    자바에서는 C와 같이 전처리기의 기능이 없기 때문에 #ifdef DEBUG와 같은 형태와 같이 디버깅 때와 릴리즈 때의 디버깅코드를 각각 별도로 생성할 수가 없다. 따라서 Log4j의 이러한 기능은 로그관리에 있어서 상당히 편리하다.

     

    Appender 설정🤴

    Appender는 로그가 출력되는 위치를 나타낸다.
    XXXAppender로 끝나는 클래스들의 이름을 보면, 출력 위치를 어느 정도 짐작할 수 있다.

    Log4j 2는 Console, File, RollingFile, Socket, DB 등 다양한 로그 출력 위치과 방법을 지원한다.
    기존 Log4j 1.x와 크게 달라진 점은 Appender 종류를 class 속성값으로 구분한 것과 달리, Log4j 2에서는 태그로 구분한다.

    Appender 선언과 정의

    모든 Appender 요소는 상위 요소인 <Appenders> 아래에 선언한다.

     <Appenders>
      <Console>...</Console>
      <File>...</File>
      <RollingFile>...</RollingFile>
      <JDBC>...</JDBC>
     </Appenders>

    Appender 요소는 name 속성값을 가지며, name 속성에 Appender 이름을 지정한다. name 속성값은 Logger가 로그 출력에 사용할 Appender를 참조하기 위해 사용한다. 또한 Appender 요소의 하위 요소로 로그 출력 패턴인 Layout을 정의한다.
    아래는 ConsoleAppender와 PatternLayout을 사용한 샘플코드이다.

     <Appenders>
       <Console name="console" target="SYSTEM_OUT">
        <PatternLayout /> <!-- 디폴트 패턴 적용, %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n -->
      </Console>
     </Appenders>
     <Loggers>
      <Logger name="egovLogger" level="DEBUG" additivity="false">
       <AppenderRef ref="console" />
      </Logger>
      <Rootlevel="ERROR">
       <AppenderRef ref="console" />
      </Root>
     </Loggers>

     

    Appender 종류

    ConsoleAppender

    FileAppender

    RollingFileAppender

     

    JDBCAppender

     

    Layout 설정👲

    Layout은 발생한 로그 이벤트의 포맷을 지정하고, 원하는 형식으로 로그를 출력할 수 있다.
    Appenders 설정과 마찬가지로 Log4j 2에서는 Layout을 class 속성이 아닌 태그로 구분한다.

    출력 형식에 따라 Layout의 종류가 달라지며, 아래와 같은 Layouts을 제공한다.

     

    PatternLayout 선언과 정의

     

    참조 : egovframework:rte3:fdl:logging:log4j_2:설정_파일을_사용하는_방법

     

    egovframework:rte3:fdl:logging:log4j_2:설정_파일을_사용하는_방법 [eGovFrame]

    Log4j 2는 기존 Properties 파일 형식의 환경 설정을 지원하지 않으며, XML (log4j2.xml) 혹은 JSON (log4j2.json or log4j2.jsn) 파일 형식의 환경 설정만 가능하다. 아래는 XML 파일을 이용한 환경 설정에 대해서만

    www.egovframe.go.kr

    반응형