# 로그(log4j) 사용하기
## 목차
1. Log4J란?
2. 구성 요소
3. 로그 레벨
4. 핵심 클래스
5. 출력 형식
6. 사용 예
## 1. Log4J란?
Log4j는 Log for Java의 줄임말로 자바프로그램의 실행과적을 기록하는 도구이다.
## 2. 구성 요소
Log4j는 크게 3가지의 요소로 구성된다.
+ Logger: 로그 기록하고 Appender에 전달.
+ Appender: 로그를 파일, 콘솔, DB, 등의 위치에 출력.
+ Layout: 로그 출력 형식을 결정.
## 3. 로그 레벨
로그는 상태 및 목적에 따라 여러 단계(level)로 나누어진다.
+ FATAL: 어플리케이션 작동이 불가능한 상태.
+ ERROR: 요청을 처리할 수 없는 상태.
+ WARN: 처리 가능하지만, 위험성을 안고 있는 상태.
+ INFO: 정보성 메세지 확인.
+ DEBUG: 개발시 디버그를 위한 사용.
+ TRACE: DEBUG 레벨의 상세화 단계.
레벨은 `FATAL > ERROR > WARN > INFO > DEBUG > TRACE`의 순으로 정렬된다.
(DEBUG 레벨로 했다면 INFO~FATAL까지 모두 logging)
## 4. 핵심 클래스
+ ConsoleAppender: 콘솔에 로그 메시지 출력
+ FileAppender: 파일에 로그 메시지 기록
+ RollingFileAppender: 자동 백업 및 기록
+ DailyRollingFileAppender: 일정 단위로 로그 기록
+ JDBCAppender: DB에 로그를 출력
+ SMTPAppender: 로그를 이메일로 전송
+ NTEventAppender: 윈도우 시스템 이벤트 로그로 메시지 전송
## 5. 출력 형식
| 포맷 | 역할 |
|:-----:|:------|
| %p | debug, info, warn, error, fatal 등의 priority 출력 |
| %m | 로그내용 출력 |
| %d | 로깅 이벤트가 발생한 시간을 출력 ex) %d{HH:mm:ss} |
| %t | 로그이벤트가 발생된 쓰레드의 이름 출력 |
| %F | 로깅이 발생한 프로그램 파일명 출력 |
| %l | 로깅이 발생한 caller의 정보 출력 |
| %L | 로깅이 발생한 caller의 라인수 출력 |
| %M | 로깅이 발생한 method 이름 출력 |
| % | % 표시 출력 |
| %n | 플랫폼 종속적인 개행문자 출력 |
| %c | 카테고리 출력 ex) 카테고리가 a.b.c 처럼 되어있다면 %c{2}는 b.c 출력 |
| %C | 클래스명 출력 ex) 클래스구조가 org.apache.xyz.SomeClass 처럼 되어있다면 %C{2}는 xyz.SomeClass 출력 |
| %r | 어플리케이션 시작 이후 부터 로깅이 발생한 시점의 시간(milliseconds) 출력 |
| %x | 로깅이 발생한 thread와 관련된 NDC(nested diagnostic context) 출력 |
| %X | 로깅이 발생한 thread와 관련된 MDC(mapped diagnostic context) 출력 |
## 6. 사용 예
라이브러리 추가(pom.xml)
```
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
```
설정파일 작성(log4j.xml)
```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<!-- Appenders -->
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p: %c - %m%n" />
</layout>
</appender>
<!-- Application Loggers -->
<logger name="com.mycompany.sd">
<level value="info" />
</logger>
<!-- 3rdparty Loggers -->
<logger name="org.springframework.core">
<level value="info" />
</logger>
<logger name="org.springframework.beans">
<level value="info" />
</logger>
<logger name="org.springframework.context">
<level value="info" />
</logger>
<logger name="org.springframework.web">
<level value="info" />
</logger>
<!-- Root Logger -->
<root>
<priority value="warn" />
<appender-ref ref="console" />
</root>
</log4j:configuration>
```