로깅이란?
프로그램을 개발하거나 운영할 때 생기는 문제점을 관리하고 모니터링할 수 있는 데이터를 말한다.
기록이란 뜻으로 프로그램이 제대로 동작하고 있는지 실행 기록을 남기는 것을 말한다.
eclipse(console) 창으로 확인할 수 있다.
log 대신 System.out.println() 으로도 console 확인이 가능하지만 io 리소스를 많이 사용해 시스템이 느려질 수 있으며, 파일로 저장은 불가능해서 주로 log를 사용해서 파일로 저장해 분석할 필요성이 있다.
로깅 툴 종류
commons-logging : 스프링 3에서 사용하면 로깅 툴
log4j : 효율적인 메모리 관리로 그동안 많이 사용됨
logback : log4j 보다 성능이 더 우수해 최근 주로 사용
SLF4j : logback을 사용하기 위한 인터페이스
maven 프로젝트의 경우 pom.xml 설정
2020-02-02 현재 최신 버전은 여기서 확인 mvnrepository.com/artifact/org.slf4j/slf4j-api/1.7.30
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.30</version>
</dependency>
logback.xml (src/main/resources)
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- log4jdbc-log4j2 -->
<logger name="jdbc.sqlonly" level="DEBUG"/>
<logger name="jdbc.sqltiming" level="INFO"/>
<logger name="jdbc.audit" level="WARN"/>
<logger name="jdbc.resultset" level="ERROR"/>
<logger name="jdbc.resultsettable" level="ERROR"/>
<logger name="jdbc.connection" level="INFO"/>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{HH:mm:ss.SSS} [%thread] %-4level [%logger.%method:%line]-
%msg%n</pattern>
</layout>
</appender>
<appender name="LOGFILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/WEB-INF/logback.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logback.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 30일 지난 파일은 삭제한다. -->
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-4level [%logger.%method:%line]
- %msg %n</pattern>
</encoder>
</appender>
<!-- 로그의 레벨( 지정된 로그 레벨 이상만 수집 ) : DEBUG < INFO < WARN < ERROR < FATAL -->
<logger name="myweb" additivity="false">
<level value="INFO" />
<appender-ref ref="LOGFILE" />
<appender-ref ref="CONSOLE" />
</logger>
<root>
<level value="INFO" />
<appender-ref ref="CONSOLE" />
</root>
</configuration>
log 사용방법
변수 선언 : private static final Logger logger = LoggerFactory.getLogger (클래스 이름.class);
명령어 호출 : logger.info ("로그 타이틀", 출력할 값);
@Controller
public class TestController {
private static final Logger logger = LoggerFactory.getLogger(TestController.class);
//로그를 수집할 클래스의 변수 선언
/**
* Simply selects the home view to render by returning its name.
*/
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home(Locale locale, Model model) {
logger.info("Welcome home! The client locale is {}.", locale);
//home 메소드에서 로그 수집 명령어를 호출한다.
}
* log Level : DEBUG < INFO < WARN < ERROR < FATAL
- Debug : Debug, info, error 포함
- Info : info, warn, error 포함
- warn : warn, error 포함
- error : error만 포함
- 아래의 jdbc.sqlonly 기록은 Debug 레벨 이상의 log만 수집하겠다는 뜻
- Lebel이 높은 log가 찍힐수록 컨트롤러 실행에 문제가 있는 것
<!-- log4jdbc-log4j2 -->
<logger name="jdbc.sqlonly" level="DEBUG"/>
<logger name="jdbc.sqltiming" level="INFO"/>
<logger name="jdbc.audit" level="WARN"/>
<logger name="jdbc.resultset" level="ERROR"/>
<logger name="jdbc.resultsettable" level="ERROR"/>
<logger name="jdbc.connection" level="INFO"/>