반응형
log4j란?
- 자바 애플리케이션을 로깅하기 위한 Apache 라이브러리
- 로거를 사용할 때 카테고리라는 이름을 붙여 사용함으로써 각 기능에 맞는 로거를 골라 출력이 가능
- 카테고리를 지정하지 않으면 패키지경로 + 클래스명이 카테고리명이됨
- Logger.getLogger() 메소드의 파라미터로 들어가는 값이 카테고리명
- 로그 출력시 {} 형식으로 파라미터를 지정할 수 없음(메시지, 메시지 + throwable만 허용)
- 로그 레벨을 지정할 수 있음
- 비동기 방식임
- 속도에 최적화되어 있음
- 설정 파일은 properties, xml 두 가지 형식을 지원함
- 자바의 예외를 처리하기 위해 디자인 되었음
- 출력을 콘솔, 파일, 이메일, 데이터베이스로 전달하여 출력할 수 있음
log4j의 구성요소
- Logger : logging 메시지를 Appender에 전달하는 역할
- Appender : 전달받은 logging 메시지를 원하는 곳으로 보내는 매개체 역할
- Layout : loggin 메시지의 출력 형식을 지정하는 역할
Appender의 종류
- AsyncAppender : 비동기 출력, 네트워크 전송 등 조금 특수한 용도에 사용, 로그 이벤트를 queue에 모은 후 다른 쓰레드에서 스케줄로 로그를 출력해주는 것, 다른 Appender와 결합해서 사용
- ConsoleAppender : Console에 stdout, stderr 출력 (주로 사용)
- DailyRollingFileAppender : 지정한 시간단위로 파일을 나눠서 출력 (주로 사용)
- ExternallyRolledFileAppender : 외부 Roller로 출력
- FileAppender : 파일 출력
- jdbc.JDBCAppender : 데이터베이스로 출력
- net.JMSAppender : JMS로 출력
- lf5.LF5Appender : LogFactor5라는 스윙 로그뷰어로 출력
- nt.NTEventLogAppender : Windows 이벤트 로그로 출력
- varia.NullAppender : 아무것도 안함
- net.SMTPAppender : 메일로 출력
- net.SocketAppender : 외부 서버에 Socket으로 출력
- net.SocketHubAppende : SocketServer로서 출력
- net.SyslogAppender : Unix Syslog로 출력
- RollingFileAppender : 파일 크기단위로 파일 출력
- net.TelnetAppender : telnet으로 출력
- WriterAppender
Layout의 종류
- SimpleLayout : 기본 레이아웃. 간단한 형식으로 로그 출력됨.
- TTCCLayout : 시간 출력에 특화된 레이아웃.
- HTMLLayout : HTML형식으로 출력한다. 테이블 형식으로 각각의 로그를 출력.
- XMLLayout : XML 형식으로 출력.
- PatternLayout : 사용자 마음대로 패턴을 지정하여 출력하게 해줌. 가장 많이 쓰임
Pattern 형식
- %d Date : 날짜 출력 / %d{yyyy-MMM-dd HH:mm:ss,SSS}, %d{ISO8601} 둘 다 사용가능
- %p Priority(FATAL, ERROR, WARN, INFO, DEBUG) : 로그 레벨 출력
- %t Thread : 로그를 생성한 쓰레드명 출력
- %c Category : 카테고리 이름 출력 / %c{1} : 최하위 레벨의 카테고리 이름을 출력
- %C Class : 로그를 생성한 클래스명을 출력
- %n \r\n or \n : 개행 문자
- %F File name : 로그가 발생한 파일명 출력
- %L Caller의 Line number : 로그가 발생한 소스의 행번호 출력
- %I Caller의 Information : 로그가 발생한 위치의 %F, %L, %M정보 출력 (사용적음)
- %M Method name : 로그가 발생하 메소드의 이름 출력
- %x NDC(Nested Diagnostic Context)의 값을 출력
- %X MDC(Mapped Diagnostic Context)의 값을 출력
- %m Message : 로그 메시지 출력
- %r 어플리케이션이 시작된 후 발생된 시간 ( milliseconds )
log4j 사용하기
pom.xml
<!-- for log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
Log4jTest.java
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath*:applicationContext*.xml"})
public class Log4jTest {
private static Logger LOGGER = Logger.getLogger(Log4jTest.class.getName());
private static Logger ERROR_CONSOLE_LOGGER = Logger.getLogger("error.console.logger");
private static Logger INFO_CONSOLE_FILE_LOGGER = Logger.getLogger("info.console.file.logger");
@Test
public void test_LOGGER() {
LOGGER.fatal("Critical 에러가 났을 때");
LOGGER.error("일반 에러가 났을 때");
LOGGER.warn("주의가 필요할 때");
LOGGER.info("일반 정보를 나타낼 때");
LOGGER.debug("디버그 정보를 나타낼 때");
LOGGER.trace("좀더 상세한 정보를 나타낼 때");
}
@Test
public void test_LOGGER2() {
ERROR_CONSOLE_LOGGER.fatal("Critical 에러가 났을 때");
ERROR_CONSOLE_LOGGER.error("일반 에러가 났을 때");
ERROR_CONSOLE_LOGGER.warn("주의가 필요할 때");
ERROR_CONSOLE_LOGGER.info("일반 정보를 나타낼 때");
ERROR_CONSOLE_LOGGER.debug("디버그 정보를 나타낼 때");
ERROR_CONSOLE_LOGGER.trace("좀더 상세한 정보를 나타낼 때");
}
@Test
public void test_LOGGER3() {
INFO_CONSOLE_FILE_LOGGER.fatal("Critical 에러가 났을 때");
INFO_CONSOLE_FILE_LOGGER.error("일반 에러가 났을 때");
INFO_CONSOLE_FILE_LOGGER.warn("주의가 필요할 때");
INFO_CONSOLE_FILE_LOGGER.info("일반 정보를 나타낼 때");
INFO_CONSOLE_FILE_LOGGER.debug("디버그 정보를 나타낼 때");
INFO_CONSOLE_FILE_LOGGER.trace("좀더 상세한 정보를 나타낼 때");
}
}
log4j.properties
- 경로 : src/main/resources/log4j.properties
- 설정파일은 properties나 xml 둘 중 하나만 사용하면 됨
# 로거 선언
# rootLogger : 프로젝트 전체를 담당하는 디폴트 로거
# log4j.logger.${카테고리명} : 카테고리명에 해당하는 로거
log4j.rootLogger=DEBUG, CONSOLE
log4j.logger.error.console.logger=ERROR, CONSOLE
log4j.logger.info.console.file.logger=INFO, CONSOLE, FILE
# 로거 설정
# log4j.additivity.${카테고리명}=false : 카테고리명이 상속받는 Appender를 상속하지 않도록 설정(설정해주지 않으면 같은 로그가 두 번씩 찍힘)
log4j.additivity.error.console.logger=false
log4j.additivity.info.console.file.logger=false
# 콘솔 Appender 설정
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss:SSS}][%t][%-5p][%C.%M():%L][%c] %m%n
# 파일 Appender 설정 (날짜가 지난 로그 파일은 example.log.yyyy-MM-dd 파일로 남겨짐)
log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender
log4j.appender.FILE.File=example.log
log4j.appender.FILE.DatePattern='.'yyyy-MM-dd
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss:SSS}][%t][%-5p][%C.%M():%L][%c] %m%n
log4j.xml
- 경로 : src/main/resources/log4j.xml
- 설정파일은 properties나 xml 둘 중 하나만 사용하면 됨
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration debug="true" xmlns:log4j='http://jakarta.apache.org/log4j/'>
<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss:SSS}][%t][%-5p][%C.%M():%L][%c] %m%n" />
</layout>
</appender>
<appender name="FILE" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="example.log" />
<param name="DatePattern" value="'.'yyyy-MM-dd" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss:SSS}][%t][%-5p][%C.%M():%L][%c] %m%n" />
</layout>
</appender>
<category name="error.console.logger" additivity="false">
<level value="ERROR" />
<appender-ref ref="CONSOLE" />
</category>
<category name="info.console.file.logger" additivity="false">
<level value="INFO" />
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</category>
<root>
<level value="DEBUG" />
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
</log4j: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] logback, slf4j (0) | 2018.07.15 |