반응형
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
- log4j에서 logback으로 옮겨야하는 이유
- log4j에서 logback으로 옮겨야하는 이유
- logback 설정
반응형
'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 |