일단 spring 프로젝트를 만들면 기본적으로 log4j에 관한 lib는 추가되어있다.
pom.xml
<!-- Test -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>
<!-- Logging -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${org.slf4j-version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${org.slf4j-version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${org.slf4j-version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.15</version>
<exclusions>
<exclusion>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
</exclusion>
<exclusion>
<groupId>javax.jms</groupId>
<artifactId>jms</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jdmk</groupId>
<artifactId>jmxtools</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jmx</groupId>
<artifactId>jmxri</artifactId>
</exclusion>
</exclusions>
<scope>runtime</scope>
</dependency>
spring 프로젝트의 Java Resource를 보면 src/main 과 src/test가 있다.
이 중 test는 실제 배포할 때는 배포되지않는다. 단순히 test용도로 쓰이는 폴더다.
log4j의 설정파일 log4j.xml은 기본적을 src/main/resources, src/test/resources에
각각 있는데 test폴더의 log4j.xml파일이 우선순위가 더 높다.
원할한 실습을 위해선 test의 log4j.xml은 삭제해주자.
그리고 log4j.xml의 DOCTYPE을 다음과 같이 변경하자.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN"
"http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
log4j에서 사용하는 태그들은 다음과 같다.
태그 | 설명 |
<appender> | 로그의 출력 위치(파일, 콘솔, DB등)를 결정합니다. |
<layout> | appender가 어디에 출력할 것인지에 대한 태그였다면 layout은 어떤 형식으로 로그를 출력할지 정해줍니다. <appender> 태그 내부에 작성합니다. |
<logger> | 로깅 메시지를 appender에 전달합니다. logger는 6단계의 레벨을 가지며, 레벨을 가지고 출력여부를 결정합니다. |
<root> | <logger>에 따로 appender를 지정하지 않았을 때 기본적으로 적용될 appender 지정 |
<appender>
appender 클래스 | 설명 |
ConsoleAppender | org.apache.log4j.ConsoleAppender 클래스로, 콘솔에 로그 메시지를 출력합니다. |
FileAppender | org.apache.log4j.FileAppender 클래스로, 파일에 로그 메시지를 출력합니다. |
RollingFileAppender | org.apache.log4j.rolling.RollingFileAppender 클래스로, 파일 크기가 일정 기준을 넘으면 기존 파일을 백업 파일로 바꾸로 처음부터 로그를 기록합니다. |
DailyRollingAppender | org.apache.log4j.rolling.DailyRollingFileAppender 클래스로, 설정한 기간 단위로 새 파일을 만들어 로그 메시지를 기록합니다. |
<layout>
속성 | 설명 |
%p | debug, info 등 로그 레벨 이름 출력 |
%m | 로그 메시지 출력 |
%d | 로깅 이벤트 발생 시각 출력 (yyyy-MM-dd HH:mm:ss) |
%c | 로깅 메시지 앞에 전체 패키지 이름이나 전체 파일 이름 출력 |
<logger>
레벨 | 설명 |
FATAL(6레벨) | 시스템 차원에서 심각한 문제가 발생했을 때의 레벨입니다. |
ERROR | 실행 중 문제가 발생한 상태를 나타냅니다. |
WARN | 시스템 오류의 원인이 될 수 있는 메시지를 나타냅니다. |
INFO | 로그인, 상태 변경과 같은 실제 애플리케이션 운영과 관련된 정보를 출력합니다. |
DEBUG | 개발 시 디버깅 용도로 사용한 메시지를 나타냅니다. |
TRACE(1단계) | DEBUG보다 상세한 로깅 정보를 출력합니다. |
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.study.home">
<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>
org.springfamework 관련해서 logger가 있고
root 폴더에 기본적으로 "console" appender가 적용되어있다.
그래서 서버를 키면 다음과 같은 로그가 찍힌다
이번 실습에서는 자세한 설명보다는 com.study에서 일어나는 일들에 대해서
콘솔과 파일에 찍히도록 작성해보았다.
log4j.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN"
"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/">
<!-- 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>
<appender name="fileLogger"
class="org.apache.log4j.DailyRollingFileAppender">
<param name="file"
value="C:\\workspace\\logs\\spring\\spring.log"/> <!-- /home/ssam/log/spring.log -->
<param name="Append" value="true" />
<param name="DatePattern" value=".yyyy-MM-dd" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="[%d{yyyy-MM-dd HH:mm:ss}] %-5p: %F:%L - %m%n" />
</layout>
</appender>
<!-- Application Loggers : 로그 찍을 위치-->
<!-- ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF
debug로 레벨설정하면 debug,info,warn 다 로그찍힘
info로 설정하면 info, warn 다 로그찍힘
mybatis쿼리는 기본적으로 debug로 되어있음 -->
<!-- Application Loggers , 파일도 찍히고 콘솔도 찍힌다. -->
<logger name="com.study" additivity="false">
<level value="debug"></level>
<appender-ref ref="fileLogger" />
<appender-ref ref="console" />
</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>
이제 FreeBoardController에 다음과 같이 log를 출력하는 코드를 작성하자.
FreeBoardController.java
private Logger logger= LoggerFactory.getLogger(this.getClass());
@RequestMapping("/free/freeList.wow")
public String freeList(Model model, @ModelAttribute("searchVO") FreeBoardSearchVO searchVO) {
logger.info("searchVO : {}" , searchVO); //이게 추가되었다
List<FreeBoardVO> freeBoardList = freeBoardService.getBoardList(searchVO);
model.addAttribute("freeBoardList", freeBoardList);
return "free/freeList";
}
"/free/freeList..wow"로 요청하였을 때 searchVO가 log로 출력될것이다.
또한 mybatis를 통해 freeBoardList를 얻을텐데 log4j.xml설정에서 level을
DEBUG로 설정했기 때문에 mybatis관련 로그도 콘솔에 보일 것이다.
또 FileAppender에 의해 파일로도 로그가 찍힐 것이다.
"/free/freeList..wow" 요청 했을 때 콘솔에 로그가 찍힌다.
또 위와 같은 내용이 파일로도 생성된다.