안녕하세요, 코린이의 코딩 학습기 채니 입니다.
개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.
Log4j
- 로그를 자동으로 출력해주는 오픈소스 라이브러리
- 출력하고자 하는 로그를 '콘솔', '로그파일', 'DB파일' 등으로 남길 수 있음
- 패키지에 따라 로그가 수집됨
Maven을 이용하여 다운받아주었습니다.
pom.xml
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
Log4j의 설정파일을 build-path에 위치!
log4j.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
<log4j:configuration
xmlns:log4j='http://jakarta.apache.org/log4j/'>
<!-- 자식태그는 appender, logger, root 태그 순으로 작성해야 함 -->
<!-- 로그 출력 주체 -->
<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} %-5p %c{1}:%L - %m%n" />
</layout>
</appender>
<!-- 로그 수집 주체 -->
<logger name="com.ce.app" > <!-- additivity="true" 기본값 -->
<level value="info" />
</logger>
<root> <!-- logger에 존재하지 않는 패키지들이라면 root를 따름 -->
<level value="DEBUG" />
<appender-ref ref="console" />
</root>
<!--
패턴문자
* %c : 카테고리명(logger이름)을 표시
* 카테고리명이 hello.world.logger일때, %c{2}는 world.logger를 출력
* %C : 클래스명을 표시함.
* 풀 클래스 명이 com.kh.logger일때, %C{2}는 kh.logger를 출력
* %d : 로그 시간을 출력한다. java.text.SimpleDateFormat에서 적절한 출력 포맷을 지정할 수 있다.
* %d{HH:mm:ss, SSS}
* %d{yyyy MMM dd HH:mm:ss, SSS}
* %d{ABSOLUTE}
* %d{DATE}
* %d{ISO8601}
* %F : 파일명을 출력. 로그시 수행한 메소드, 라인번호가 함께 출력된다.
* %l : 로깅이 발생한 caller의 위치정보.메소드명 (자바파일명:라인번호) - 링크제공
* %L : 라인 번호만 출력한다(링크없음)
* %m : 로그로 전달된 메시지를 출력한다.
* %M : 로그를 수행한 메소드명을 출력한다.
* %n : 플랫폼 종속적인 개행문자가 출력. rn 또는 n
* %p : 로그 이벤트명등의 priority 가 출력(debug, info, warn, error, fatal )
* %r : 로그 처리시간 (milliseconds)
* %t : 로그이벤트가 발생된 쓰레드의 이름을 출력
* %% : % 표시를 출력. escaping
* %r : 어플리케이션 시작 이후 부터 로깅이 발생한 시점의 시간(milliseconds)
* %X : 로깅이 발생한 thread와 관련된 MDC(mapped diagnostic context)를 출력합니다. %X{key} 형태.
-->
</log4j:configuration>
가장 구체적으로 패키지를 선언한 곳에서 가장 먼저 수집되며, 수집된 로그가 root까지 올라갑니다.
root태그에 <appender-ref>의 ref가 'console'로 지정되어있는데, 이를 appender태그의 'console'로 전달됩니다.
그러면 ConsoleAppender객체가 만들어져서 정해놓은 패턴에 따라 로그를 출력해줍니다.
logger 태그의 additivity 속성은 수집된 로그를 root까지 올려주느냐 마느냐를 설정해주는 것으로, true가 기본 값입니다.
(false - 버블링을 막음)
logger태그에서 처리하지 못하는 다른 패키지가 있다면, root 태그의 level를 따라가게 됩니다.
Log4jTest
public class Log4jTest {
static final Logger log = Logger.getLogger(Log4jTest.class);
public static void main(String[] args) {
log.fatal("fatal!");
log.error("error!");
log.warn("warn!");
log.info("info!");
log.debug("debug!");
log.trace("trace!");
}
}
@콘솔출력값
2022-08-04 20:19:31 FATAL Log4jTest:9 - fatal!
2022-08-04 20:19:31 ERROR Log4jTest:10 - error!
2022-08-04 20:19:31 WARN Log4jTest:11 - warn!
2022-08-04 20:19:31 INFO Log4jTest:12 - info!
logger에서 com.ce.app 패키지에 한하여 level를 'info'로 주었기 때문에 info 하위의 'debug!', 'trace!'는 출력되지 않는 것을 확인할 수 있습니다.
만약 xml파일에서 level를 'debug'로 해준다면, debug까지 출력되겠죠.
(운영모드에서는 warn 혹은 info로 level를 지정)
fatal - 아주 심각한 에러
error - 처리 도중 오류(예외) 발생
warn - 현재 프로그램 실행에는 문제되지 않지만 향후 시스템의 잠재적 오류가 될 수 있는 경우
info - 프로그램 실행 중 상태 변경 등의 메세지
debug - 개발 도중 필요한 메세지
trace - 흐름의 시작과 끝을 정의하는 용도
'Java > Java' 카테고리의 다른 글
네트워크) TCP 소켓 프로그래밍 (채팅 프로그램 만들기) (0) | 2022.04.11 |
---|---|
네트워크) InetAddress, URL, URLConnection (0) | 2022.04.11 |
쓰레드) 동기화(Synchronization)이란? (0) | 2022.04.04 |
쓰레드) 쓰레드 컨트롤 (sleep, join, interrupt), Daemon 쓰레드 (0) | 2022.04.03 |
쓰레드) 쓰레드란?, 멀티쓰레드, 장단점, 쓰레드 우선 순위 (0) | 2022.04.03 |