반응형

logback이란?

  • log4j 개발자가 개선사항을 반영하여 만듬
  • slf4j의 native 구현체
  • 설정 변경시 WAS 재시작 없이 지정된 시간에 변경사항을 다시 읽어들여 반영
  • 설정 파일 안에서 if-then-else 조건문을 사용 가능

slf4j

  • logback을 만들며 같이 만듬
  • 로깅 구현체가 아닌 logging facaed(인터페이스정도로 생각하면 될듯)
  • 구현체의 종류와 상관 없이 일관된 로깅 코드 작성이 가능
  • 구현체들의 변경이 일어날 경우 최소한의 수정으로 적용 가능하도록 도와줌
  • 위의 이유로 logback + slf4j 조합으로 많이 사용중
  • 로그 파라미터로 {}를 지정할 수 있음

log4j에서 logback으로 옮겨야하는 이유?

  • Automatic Reloading Configuration file : 설정 변경시 WAS 재시작 없이 지정된 시간이 지나면 변경을 감지하고 다시 읽어들임 (log4j는 WAS 재시작 필요)
  • Graceful Recovery from I/O Failures : FileAppender를 사용하여 로그를 파일서버에 저장시 I/O Fail이 났다가 정상으로 돌아오면 자동복구처리됨 (log4j는 WAS 재시작 필요)
  • Automatic Compress : 자동압축, 시간이 지난 파일을 자동으로 삭제하는 기능 제공 (log4j는 미지원)
  • Prudnect Mode : 다수의 JVM 인스턴스에서 같은 로그 파일을 사용하여 로그를 안전하게 기록 가능 (log4j는 미지원)
  • Conditional Processing Configurations : 설정파일 안에서 if-then-else 조건문을 사용 가능 (log4j는 미지원)
  • Stack Traces with Packaging Data : Stack Trace 로깅시 각 패키지의 아티팩트 정보와 버전 정보를 출력해줌 (log4j는 미지원)
  • faster implementation : 성능은 약 10배정도 개선, 메모리 점유도 보다 적게 사용
  • extensive battery of tests : 더 많은 테스트의 반복과정을 수행, 높은 퀄리티를 보장

logback 사용하기

pom.xml

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-core</artifactId>
    <version>1.1.2</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.1.2</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.10</version>
</dependency>
<!-- 조건부 설정을 사용하려면 아래의 디펜던시를 추가해 주어야 한다. -->
<dependency>
    <groupId>org.codehaus.janino</groupId>
    <artifactId>janino</artifactId>
    <version>2.7.7</version>
</dependency>

LogbackTest.java

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath*:applicationContext*.xml"})
public class LogbackTest {
    // slf4j의 Logger
    private static Logger LOGGER = LoggerFactory.getLogger(LogbackTest.class.getName());

    @Test
    public void test_LOGGER() {
        LOGGER.error("일반 에러가 났을 때 {}, {}, {}, {}, {}", 1, 2, 3, 4, 5, new Exception("Test Error"));
        LOGGER.warn("주의가 필요할 때 {}, {}, {}, {}, {}", 1, 2, 3, 4, 5, new Exception("Test Error"));
        LOGGER.info("일반 정보를 나타낼 때 {}, {}, {}, {}, {}", 1, 2, 3, 4, 5, new Exception("Test Error"));
        LOGGER.debug("디버그 정보를 나타낼 때 {}, {}, {}, {}, {}", 1, 2, 3, 4, 5, new Exception("Test Error"));
        LOGGER.trace("좀더 상세한 정보를 나타낼 때 {}, {}, {}, {}, {}", 1, 2, 3, 4, 5, new Exception("Test Error"));
    }
}

logback.xml

  • 경로 : src/main/resources/logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 30초마다 설정 파일의 변경을 확인한다. 파일이 변경되면 다시 로딩한다 -->
<configuration scan="true" scanPeriod="30 seconds">
    <!-- 외부 설정파일을 사용할 수 있다. -->
    <property resource="common.properties" />

    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>[%d{yyyy-MM-dd HH:mm:ss:SSS}][%t][%-5p][%C.%M:%L] %m%n</pattern>
        </encoder>
    </appender>

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>example.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 파일이 하루에 한개씩 생성된다 -->
            <fileNamePattern>example.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- maxHIstory 설정은 위 부분에 롤링 정책에 따라 적용되 된다고 보면된다. 위 설정대로라면 30일이 지난 파일은 삭제가 된다.-->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>[%d{yyyy-MM-dd HH:mm:ss:SSS}][%t][%-5p][%C.%M:%L] %m%n</pattern>
        </encoder>
    </appender>

    <logger name="org.springframework" level="INFO" additivity="false">
        <appender-ref ref="CONSOLE" />
    </logger>

    <logger name="com.test.spring.home" level="DEBUG" additivity="false">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE" />
    </logger>

    <logger name="org.hibernate" level="DEBUG" additivity="false" />

    <if condition='property("server.profile").equals("real")'>
        <then>
            <root level="INFO">
                <appender-ref ref="CONSOLE" />
                <appender-ref ref="FILE" />
            </root>
        </then>
        <else>
            <root level="DEBUG">
                <appender-ref ref="CONSOLE" />
                <appender-ref ref="FILE" />
            </root>
        </else>
    </if>
</configuration>

참고 URL

반응형

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

[Java] Json Handling(with Jackson)  (0) 2019.03.20
[Java] HTML 파싱  (0) 2019.03.20
[Java] Garbage Collector  (0) 2018.07.24
[Java] JDK 설치  (0) 2018.07.22
[Java] log4j  (0) 2018.07.15

+ Recent posts