JUST WRITE

Log4j vs Logback 본문

Programing/Java

Log4j vs Logback

천재보단범재 2021. 10. 26. 22:55

Log4j vs Logback

Log는 프로그램의 Event 기록을 남기는 것이다.

Log를 통해 프로그램의 동작 상태를 파악하거나 에러의 원인을 찾을 수 있다.

Log는 기존의 Debugger나 println에 비해 아래와 같은 장점이 있다.

  • 상황별로 Level를 지정, Level 별 메시지 선택 가능
  • 프로그램 실행 흐름과 에러 확인 가능
  • framework를 이용하여 간단하게 사용환경 조성
  • Module별로 유연하게 메시지 출력 가능
  • 자유롭고 다양하게 출력 가능

이번 글에서 대표적인 Java Log Framework를 소개하려고 합니다.

Log4j

Log4j

Log4j(Log for Java)

Apache Logging Service 하위 프로젝트이다.

현재 Log4j를 개선한 Log4j2 버전이 나왔다.

Log4j2는 성능 향상은 물론 필터링 기능과 자동 reloading 기능을 제공한다.

특징

  • 속도, 유연성 고려, 속도에 최적화
  • Multi-Thread 지원
  • 계층 Log 설정 및 지원
  • 출력 포맷 폭넓게 지원 -> File, Console, OutputStream, Writer, TCP, Email

구조

  • Logger
    • Log4j 핵심 Class -> 실제 Log 기능 수행
    • 그룹핑, 우선순위 부여 방식 지원
  • Appender -> Log 출력 위치 지정
    • ConsoleAppender
    • FileAppender
    • RollingFileAppender
    • DailyRollingAppender
    • SMTPAppender
    • NTEventLogAppender
  • Layout -> Log 출력 위치 조정

Log Level

Level  설명
FATAL  아주 심각한 에러
ERROR  어떠한 요청을 처리하는 중 문제가 발생한 상태
WARN  실행에 문제는 없지만 향후 시스템에 에러의 원인이 될 수 있는 경고성 메시지
INFO  상태 변경과 같은 정보성 메시지
DEBUG  개발 시 디버그 용도로 사용하는 메시지
TRACE  디버그 레벨의 광범위함을 해결하기 위해 좀 더 상세한 이벤트 표시

SLF4J

slf4j

Simple Logging Facade for Java

구현체라기 보단 Logging Facade이다.

logger 추상체로서 다른 Log Framework가 접근할 수 있도록 도와주는 추상화 계층이다.

창구 일원화 패턴으로 여러 가지 Log Framework 쓰더라도 Logger로 통일된다.

(java.util.logging, logback, log4j(log4j2))

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

public class HelloWorld {
  public static void main(String[] args) {
    Logger logger = LoggerFactory.getLogger(HelloWorld.class);
    logger.info("Hello World");
  }
}

Logback

logback

Logback Project

Log4j이후에 출시된 가장 널리 사용하고 있는 Logging Framework이다.

Spring Boot에서 spring-boot-starter-web 내 spring-boot-starter-logging에 기본적으로 logback이 들어있다.

특징

  • Log4j보다 10배 -> 속도, 메모리 효율성 향상
  • 서버 재기동 없이 설정 파일 변경 자동 갱신
  • 서버 중지 없이 I/O Failure에 대한 복구 지원

구조

  • Logger -> 실제 Logging 수행하는 구성 요소
  • Appender -> Log 출력 위치 지정
  • Encoder -> Appender에 포함, 사용자 지정 형식 표현될 Log 메시지 변환 역할

Logback Example

pom.xml

<!-- springframework 기본적으로 commons-logging 사용, 제외 필요-->
<dependency>
	<groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>${spring-version}</version>
  <exclusions>
	  <exclusion>
	    <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
    </exclusion>
  </exclusions>
</dependency>

<!-- SLF4J -->
<dependency>
	<groupId>org.slf4j</groupId>
  <artifactId>jcl-over-slf4j</artifactId>
  <version>1.7.30</version>
</dependency>

<!-- LOGBACK -->
<dependency>
	<groupId>ch.qos.logback</groupId>
	<artifactId>logback-classic</artifactId>
	<version>${logback.version}</version>
</dependency>

<!-- SQL Log 처리 -->
<dependency>
	<groupId>org.bgee.log4jdbc-log4j2</groupId>
	<artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
	<version>1.16</version>
</dependency>

logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds">

    <!-- LOG_HOME 기본은  tomcat 도커 기준, 사이트에 따라 수정 
    <property name="LOG_HOME" value="/usr/local/tomcat/logs" />
    <property name="FILE_NAME" value="dataware" />
    -->

    <appender name="std-console-out" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern> DATAWARE: %d{yyyy-MM-dd HH:mm:ss} %5p [%35.35C:%4.4L] - %m%n </pattern>
        </encoder>
    </appender>
    <appender name="sql-console-out" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern> DATAWARE SQL: %d{yyyy-MM-dd HH:mm:ss} %5p%n%m%n </pattern>
        </encoder>
    </appender>
    
    <!-- File로 로그를 남기고자 할 때 사용
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/${FILE_NAME}.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/${FILE_NAME}.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>

        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %-4relative - [ %thread{10} ] %logger{35} - %msg%n</pattern>
        </encoder>
    </appender>
    -->

    <!-- 플러그인을 사용할 경우 Aspect에 대한 Logging -->
    <logger name="com.encore.aspect" level="INFO" additivity="false">
        <appender-ref ref="std-console-out"/>
    </logger>

    <logger name="encore.meta" level="INFO" additivity="false">
        <appender-ref ref="std-console-out"/>
    </logger>

    <logger name="encore.meta.web.controller" level="INFO" additivity="false">
        <appender-ref ref="std-console-out"/>
    </logger>

    <logger name="org.springframework.web.servlet" level="INFO" additivity="false">
        <appender-ref ref="std-console-out"/>
    </logger>

    <logger name="org.mybatis.spring" level="INFO" additivity="false">
        <appender-ref ref="std-console-out"/>
    </logger>

    <!-- <logger name="log4jdbc.log4j2" level="ERROR" additivity="false">
        <MarkerFilter marker="LOG4JDBC_NON_STATEMENT" onMatch="DENY" onMismatch="NEUTRAL"/>
        <AppenderRef ref="sql-console-out"/>
    </logger> -->
    
    <!-- 파라미터 Logging -->
    <logger name="encore.meta.filter.RequestParameterFilter" level="DEBUG" additivity="false">
        <appender-ref ref="std-console-out"/>
   <!-- <appender-ref ref="FILE"/> File로 로그를 남기고자 할 때 사용 -->
    </logger>

    <!-- SQL Logging -->
    <logger name="jdbc.sqltiming" level="INFO" additivity="false">
        <appender-ref ref="sql-console-out"/>
   <!-- <appender-ref ref="FILE"/> File로 로그를 남기고자 할 때 사용 -->
    </logger>

    <root level="error">
        <appender-ref ref="std-console-out"/> <!-- Console에 로그를 출력하고자 할 때 사용 -->
   <!-- <appender-ref ref="FILE"/> File로 로그를 남기고자 할 때 사용 -->
    </root>

</configuration>

[참고사이트]

728x90
반응형

'Programing > Java' 카테고리의 다른 글

Serialization  (0) 2021.11.20
Optional  (0) 2021.10.31
Interface vs Abstract  (0) 2021.10.21
Generic  (0) 2021.10.15
LinkedList  (0) 2021.10.11
Comments