프로그램, 또는 웹 서버를 개발하면서 값, 상태, 오류 등을 출력해야 하는 일이 발생한다.
보통은 System.out.print 또는 System.err.pring를 이용한다. 이렇게 사용하면 시스템에 자원을 낭비할 뿐만 아니라 Log를 찾는것도 어렵고 유지하기도 어렵다.
따라서 로그를 따로 출력하거나 저장하여 사용하여야 한다.
Log4j(Log For Java)의 장점
- System.out.print에 비해서 속도가 빠르다.
- 멀티스레드 환경에서도 안전하게 작동한다.
- 계층적인 로그 설정과 처리가 가능하다.
- 출력을 콘솔, 원격, Email, DB, 파일등 다양하게 가능하다.
Slf4J(Simple Logging Facade For Java)이란?
log4j, logback, commons-logging 같은 로깅 프레임워크를 위한 추상화를 제공한다.
사용해보기
1. 스프링이 기본으로 사용하는 commons-logging를 제거
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
<!-- Log4j와 Slf4j 사용함에 따라서 commons-logging 예외 처리 -->
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
2. Log4j와 Slf4j 추가
<!-- Logging -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${slf4j.version}</version>
</dependency>
3. 설정 파일 생성 및 선언
- log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//LOGGER" "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/" debug="true">
<!-- 콘솔로 출력 -->
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<param name="encoding" value="UTF-8"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="{%-5p} [%d] <%c.%M()> : %m%n" />
</layout>
<!-- 쿼리문 보여주는 옵션 -->
<filter class="org.apache.log4j.varia.StringMatchFilter">
<param name="StringToMatch" value="Result" />
<param name="AcceptOnMatch" value="false" />
</filter>
</appender>
<!-- 파일로 로그 생성 -->
<appender name="logfile" class="org.apache.log4j.DailyRollingFileAppender">
<param name="encoding" value="UTF-8"/>
<param name="Threshold" value="DEBUG"/>
<param name="File" value="/home/logs/bizseeNew/ps2.log"/>
<param name="Append" value="true"/>
<param name="ImmediateFlush" value="true"/>
<!-- (properties)이전에 저장되는 것을 막기 위해 File보다 뒤에 선언 되어야 한다. -->
<param name="DatePattern" value="yyyy-MM-dd"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="{%-5p} [%d] <%c.%M()> : %m%n" />
</layout>
<!-- 쿼리문 보여주는 옵션 -->
<filter class="org.apache.log4j.varia.StringMatchFilter">
<param name="StringToMatch" value="Result"/>
<param name="AcceptOnMatch" value="false"/>
</filter>
</appender>
<!-- 로그 영역 -->
<root>
<priority value="DEBUG" />
<appender-ref ref="console" />
<appender-ref ref="logfile" />
</root>
- web.xml
-- 중간 추가 --
<!-- log4 refresh -->
<context-param>
<param-name>log4jRefreshInterval</param-name>
<param-value>2000</param-value>
</context-param>
<!-- log4j2.xml연결 -->
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>classpath:log4j2.xml</param-value>
</context-param>
<!-- log 클래스 파일 -->
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
기타 옵션
출력 서식 옵션
- %c, %logger : 해당 로그를 쓰는 로거의 이름.
- %C, %class : 해당 로그를 요청한 클래스 이름
- %d, %date : 해당 로그가 발생한 시간
- %enc, %encode : 특정 언어에서의 출력을 위한 문자 인코딩
- %ex, %exception, %throwable : 예외 로그. 길이를 설정할 수 있음.
- %F, %file : 해당 로그가 발생한 클래스 파일명
- %l, %location : 해당 로그가 발생한 클래스명.메소드명(파일:라인)
- %L, %line : 해당 로그가 발생한 라인 번호
- %m, %msg, %message : 로그문에 전달된 메시지
- %n : 줄바꿈
- %p, %level : 로그 레벨
- %r, %relative : 로그 처리시간
- %t, %thread : 해당 로그가 발생한 스레드명
- %style{pattern}{ANSI style} : ANSI를 사용해 특정 패턴을 스타일링함
- %highlight{pattern}{style} : 로그 레벨명을 ANSI 색깔로 하이라이트
출력 레벨 설정
- FATAL : 아주 심각한 에러가 발생한 상태
- ERROR : 요청을 처리하는 중 문제가 발생한 상태
- WARN : 처리 가능한 문제이지만, 향후 에러의 원인이 될 수 있는 상태
- INFO : 로그인, 상태변경과 같은 정보성 메세지
- DEBUG : 개발시 디버그 용도로 사용
- TRACE : 디버그 레벨이 너무 광범한 것을 해결하기 위해서 좀 더 상세한 상태를 나타냄
출처: https://sjh836.tistory.com/161 [빨간색코딩]
'개인 공부 상자 > 참고 자료' 카테고리의 다른 글
JWT와 Session인증 차이점 정리 (0) | 2022.08.06 |
---|---|
Spring Framework 실행 순서 (0) | 2021.10.07 |
스프링에서 AOP란? (0) | 2021.10.07 |
스프링 컨테이너란? (0) | 2021.10.07 |
이름.properties란? (0) | 2021.10.06 |