새로운 블로그로 이전하였습니다!
Published 2022. 8. 2. 19:28

Logging

Logging은 프로그램 실행 중 정보(성공, 실패, 시간, 횟수 등)를 기록하는 행위로 System.out.println() 또한 logging의 일종이다.

System.out.println()

대부분의 개발자들은 로그를 찍기 위해 System.out.println() 메서드를 사용한 시스템 로그를 많이 사용한다. 이 방법은 가장 간단하고 쉽긴 하지만 서비스 운영중엔 확인이 어렵고 성능에 영향도 많이 준다.

파일이나 콘솔에 로그를 남길 경우 내용이 완전히 프린트되거나 저장될 때까지, 이후 프린트하려는 작업은 대기할 수 밖에 없다. 이 대기 시간은 또한 시스템의 성능에 의존하게 된다.

더 큰 문제는 보통 개발을 하는 사람과 서비스를 운영하는 사람은 다르기 때문에

System.out.println()같은 개발에서만 사용되는 출력 방식은 운영 측에서 확인이 불가능하다.

Log4j

Log4j는 프로그래머가 로그의 출력을 다양한 대상과 형태로 출력할 수 있도록 해주는 도구이다.

날짜/시간/로그 생성자/ 타입(ERROR, INFO, DEBUG 등) 등 다양한 정보를 로그와 함께 기록할 수 있어서 필터링이 가능하고 저장 위치와 방식도 변경이 가능하여 기록하고 가져올 수 있고 성능또한 System.out.println보다 우수하다.

Log4j 사용하기

og4j 플러그인 import

  1. Servlet 환경의 경우 WEB-INF 안에 log4j.jar 넣기
  2. Maven 환경의 경우 <dependency> 추가
  3. Gradle 환경의 경우 build.gradle 에 내용 추가

참고 : https://mvnrepository.com/artifact/log4j/log4j/1.2.17

log4j.xml 설정 입력 ( src/main/resoruces/ )

<?xml version="1.0" encoding="UTF-8"?>

<appender name="Appender_NAME" class="org.apache.log4j.DailyRollingFileAppender">
   <param name="File" value="/path/log4j.log"></param>
   <param name="DatePattern" value="yyyy.MM.dd"></param>
   <layout class="org.apache.log4j.PatternLayout">
       <param name="ConversionPattern" value="%d{ISO8601} %-5p %c %x - %m%n"></param>
   </layout>
   </appender>
   <logger name="logger1" additivity="false">
      <level value="debug"></level>
      <appender-ref ref="Appender_NAME"></appender-ref>
   </logger>
   <logger name="logger2" additivity="false">
   <level value="debug"></level>
   <appender-ref ref="Appender_NAME"></appender-ref>
</logger>

<log4j-configuration>

  • 로그 출력을 위한 Log4j 설정

<appendar>

  • <log4j-configuration>의 하위 태그
  • name : 로그 Appender 설정을 구분할 이름
  • class : 로그를 출력할 방법( 파일 or DB or 콘솔 외 등등 ) Appender 클래스 지정
  • VALUE : “org.apache.log4j.DailyRollingFileAppender” : 지정한 시간 단위로 파일 출력
    • DailyRollingFileAppender의 경우 DatePattern 지정 필요
ConsoleAppender
콘솔에 로그 메세지 출력
FileAppender
파일에 로그 메세지 출력
RollingFileAppender
파일의 크기가 일정 수준 이상이 되면 로그 파일을 백업파일로 바꾸고 새로 기록
DailyRollingFileAppender
일정 기간 단위로 로그 파일을 생성하고 기록
JDBCAppender
DB에 로그를 출력

<param>

  • <log4j-configuration>의 하위 태그
  • File : .log 파일 생성 위치, 
  • DatePattern : 지정한 날짜마다 로그 파일을 갱신
  • ex) “yyyy.MM.dd” : 매일 자정에 기존 로그 파일 저장 후 새 로그 파일로 변경

<layout>

  • class : 로그 출력 형식에 대한 Layout 클래스 지정
  • PatternLayout 으로 지정했을 경우 사용자가 패턴 지정 가능
  • <param name : “ConversionPattern” value=”%d{ISO8601} %-5c %c %x - %m%n
%p
로그 레벨 출력
%m
로그 내용 출력
%d
로깅 이벤트가 발생한 시간 출력
형식 예) %d{ISO8601} 혹은 %d{HH:mm:ss}
ISO8601 : yyyy-MM-dd HH:mm:ss
%t
로깅 이벤트가 발생한 쓰레드의 이름 출력
%F
로깅 이벤트가 발생한 프로그램 파일명 출력
%l
로깅 이벤트가 발생한 caller의 정보 출력
%L
로깅 이벤트가 발생한 caller의 라인 수 출력
%M
로깅 이벤트가 발생한 method 이름 출력
%n
개행문자 출력
%C
클래스명 출력

<logger>

  • <log4j-configuration>의 하위 태그
  • name : 로그 파일을 작성하는 로직이 담긴 클래스
  • additivity : 로그 중복 출력 ( false : 중복 출력 X )

<level>

  • <logger>의 하위 태그
  • value : 로그 레벨 설정 FATAL > ERROR > WARN > INFO > DEBUG > TRACE 순
  • DEBUG 레벨로 지정했드면 FATAL ~ DEBUG 까지 로깅

<appender-ref>

  • <logger>의 하위 태그
  • ref : <appender> 태그의 name 속성의 값 입력하여 참조

Logging할 클래스에 Log4j 클래스 불러오기

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LoggerEx {
    public Logger logger = LoggerFactory.getLogger(this.getClass());

    public static void main(String[] args) {
        LoggerEx log = new LoggerEx();

        log.logger.info("info");
        log.logger.error("error");
        log.logger.debug("debug");
    }
}

출력결과

------------------------------------------------------------

INFO LoggerEx.main(LoggerEx.java:11) - info

ERROR LoggerEx.main(LoggerEx.java:12) - error

DEBUG LoggerEx.main(LoggerEx.java:13) - debug

------------------------------------------------------------

예시

FATAL : 아주 심각한 오류 ( 애플리케이션 작동 불가 등 ) 

ERROR : 요청 처리 실패 ( 초기화 실패 등 )

WARN : 프로그램 실행엔 문제가 없을 수도 있는 오류

INFO : 정보

DEBUG : 디버그 용도 ( 작업 수행 시간 등 Dev 참고용 )

TRACE : DEBUG 보다 상세한 로그를 남기는 용도

복사했습니다!