티스토리 뷰
개발 중에 디버깅을 위해 System.out.println을 사용할 경우, 매번 I/O 작업이 발생하여 성능을 떨어뜨린다.
이 경우, 개발 중 추가한 디버깅 메시지를 실 서비스하는 시점에서 제거하거나 주석처리를 해야 한다. ㅡㅡ.
이런 부분들은 Logging 라이브러리를 사용함으로써 해소할 수 있다.
대표적인 Logging 라이브러리로 SLF4J 인터페이스가 있으며, 구현체로는 log4j와 logback이 존재한다. (logback을 사용해야 하는 이유)
1. pom.xml에 dependency 추가
1 2 3 4 5 | <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> | cs |
2. src/main/resources/logback.xml 추가
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration> <configuration> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <layout class="ch.qos.logback.classic.PatternLayout"> <Pattern>%d{HH:mm:ss.SSS} [%-5level] [%thread] [%logger{36}] - %m%n</Pattern> </layout> </appender> <!-- 자바 패키지별 log level을 설정한다. --> <logger name="패키지명" level="ERROR" /> <!-- 기본 log level을 설정한다. --> <root level="ERROR"> <appender-ref ref="STDOUT" /> </root> </configuration> | cs |
3. log 작성
1 2 3 4 5 6 7 8 9 10 | import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class Logging { private static final Logger LOG = LoggerFactory.getLogger(Logging.class); public static void main(String[] args) { LOG.debug("Hello Logback"); } } | cs |
3-1 통합개발도구의 template 기능 활용 (Window->Preferences->Java -> Editor -> Templates)
1 2 | ${:import(org.slf4j.Logger,org.slf4j.LoggerFactory)} private static final Logger LOG = LoggerFactory.getLogger(${enclosing_type}.class); | cs |
3-2 slf4j에서 성능을 고려한 로그 메시지 생성String name = "example";log.debug("Hello Logback "+name);log level이 info 이상이더라도, "Hello Logback "+name 연산 후 log level을 판단하므로 불필요한 연산 발생
logback에서는 log.debug("Hello Logback {}",name);
로그 레벨(log level)
TRACE < DEBUG < INFO < WARN < ERROR
설정 파일에서 로그 레벨 변경만으로 로그 메시지의 출력 여부를 결정할 수 있다.
즉, DEBUG 레벨로 설정하면 DEBUG 레벨보다 높은 로그 레벨의 메시지가 모두(DEBUG, INFO, WARN, ERROR) 출력된다. ERROR 레벨로 설정하면 ERROR 레벨의 로그만 출력되는 방식으로 동작한다.
(추가적으로) syslog처럼 java logging도 파일로도 남길 수 있고, 원격으로 보낼 수도 있다. 추후에 다양한 로깅방법들을 학습하고, ELK 스택 적용 방법에 대해서도 포스팅할 계획이다.
'Programming > .common' 카테고리의 다른 글
git flow (0) | 2018.06.17 |
---|---|
HTML + CSS 연습 (0) | 2017.11.16 |
RESTful API란 ? (11) | 2017.11.08 |
'객체 지향과 디자인 패턴' 후기 (0) | 2017.10.02 |
blocking vs non-blocking / synchronous vs asynchronous (0) | 2017.09.01 |