카테고리 없음

로깅 툴이란? Logger

아디봉 2021. 2. 2. 17:40

로깅이란?

프로그램을 개발하거나 운영할 때 생기는 문제점을 관리하고 모니터링할 수 있는 데이터를 말한다.

기록이란 뜻으로 프로그램이 제대로 동작하고 있는지 실행 기록을 남기는 것을 말한다. 

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

slf4j

<!-- 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"/>