취미로 음악을 하는 개발자

[Spring Boot] logback 본문

공대인/Spring[Boot]

[Spring Boot] logback

영월특별시 2019. 8. 16. 18:06
728x90

logback


자바는 log4j, logback, log4j2, apache common logging, SLF4j 등 다양한 프레임워크를 가지고 있다.

그 중 logback을 스프링 부트에서 기본적으로 지원한다.

- application.properties를 통한 로깅 설정

- 스프링부트 로깅 커스터마이징 (Spring Boot Loggin Customizing)지원


스프링이나 일반 자바프로그램의 경우 보통 logback.xml 파일을 resources 디렉토리에 만들어서 참조하고

logback은 이 설정파일을 자동으로 찾는데

logback.groovy -> logback-test.xml -> logback.xml 순서로 찾고 없으면 디폴트 설정을 따름


스프링 부트의 경우 logback-spring.xml이라는 이름으로 설정하는데 그 이유는

logback.xml이라는 이름으로 이미 스프링 부트가 설정되기 전에 로그백 관련 설정이 되어있기 때문에



프로젝트 생성




코드 구현


// application.properties

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server.port = 8081
# JSP
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
 
spring.datasource.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
spring.datasource.url=jdbc:log4jdbc:mysql://112.167.20.57:3306/kfc?useSSL=false&characterEncoding=UTF-8&serverTimezone=UTC
spring.datasource.username=nakji
spring.datasource.password=mysql
 
mybatis.mapper-locations=classpath:mybatis/mapper/**/**.xml
 
spring.output.ansi.enabled=always
 
logging.path=logs
 
logging.level.com.study.springboot=DEBUG
cs


13번 줄은 콘솔 창에 출력되는 로깅 메시지를 색으로 구분해서 출력

15번 줄은 로그 메시지가 저장되는 로그 디렉토리

17번 줄은 loggin.level.{패키지 경로}를 통해 로깅 레벨을 결정


// build.gradle의 dependencies 부분

1
2
3
4
5
6
7
8
9
10
11
12
13
14
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-jdbc'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation("mysql:mysql-connector-java")
    implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.0'
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    implementation 'javax.servlet:jstl'
    implementation 'org.apache.tomcat.embed:tomcat-embed-jasper'
    
    implementation 'org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4:1.16'
}
cs



1
2
3
4
5
6
7
8
9
package com.study.springboot.jdbc;
 
import lombok.Data;
 
@Data
public class MyUserDTO {
    private int id;
    private String auth;
}
cs



1
2
3
4
5
6
7
8
9
10
package com.study.springboot.jdbc;
 
import java.util.List;
 
import org.apache.ibatis.annotations.Mapper;
 
@Mapper
public interface IMyUserDao {
    List<MyUserDTO> list();
}
cs



// MyUserDao.xml

1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    
<mapper namespace="com.study.springboot.jdbc.IMyUserDao">
    <select id="list" resultType="com.study.springboot.jdbc.MyUserDTO">
        select * from user
    </select>
</mapper>
cs



// logback-spring.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
 
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>
                [%d{yyyy-MM-dd HH:mm:ss}:%-3relative] [%thread] %-5level %logger{36} -%msg%n
            </pattern>
        </encoder>
    </appender>
    
    <logger name="com.study.springboot" level="debug"/>
    
    <root level="info">
        <appender-ref ref="console"/>
    </root>
</configuration>
cs


SQL 로그info 레벨에서는 출력이 안되고 debug 레벨부터 출력 가능

* 위처럼 해도 나오지만 좀 더 정확하게 하려면 아래의 코드를 사용


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
 
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>
                %d{yyyy-MM-dd HH:mm:ss}:%-3relative [%thread] %-5level %logger{36} -%msg%n
            </pattern>
        </encoder>
    </appender>
    
    <logger name="com.study.springboot" level="info"/>
    
    <logger name="jdbc" level="OFF" />
    <logger name="jdbc.sqlonly" level="OFF" />
    <logger name="jdbc.sqltiming" level="DEBUG" />
    <logger name="jdbc.resultset" level="OFF" />
    <logger name="jdbc.resultsettable" level="DEBUG" />
    <logger name="jdbc.connection" level="OFF" />
    
    <root level="off">
        <appender-ref ref="console"/>
    </root>
</configuration>
cs



// log4jdbc.log4j2.properties

1
2
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
log4jdbc.dump.sql.maxlinelength=0
cs



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package com.study.springboot;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
 
import com.study.springboot.jdbc.IMyUserDao;
 
@Controller
public class MyController {
    @Autowired
    private IMyUserDao userDao;
    
    @RequestMapping("/")
    public @ResponseBody String root() throws Exception {
        return "MyBatis 사용하기";
    }
 
    //@GetMapping("/user")
    @RequestMapping(value = "/user", method = RequestMethod.GET)
    public String userlistPage(Model model) {
        model.addAttribute("users", userDao.list());
        return "userlist";
    }
}
cs



// userlist.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
    out.println("MyBatis : Hello World");
%>
<br>
<c:forEach var="dto" items="${users}">
    ${dto.id} / ${dto.auth} <br>
</c:forEach>
</body>
</html>
cs



로그 출력





어떤 SQL문이 실행되고 시간과 SQL 결과가 같이 출력됨



Comments