본문 바로가기
IT, 개발/JAVA

log4jdbc 로그 출력하기 (MySQL, Spring Framework, log4j)

by 개발자스터디 2022. 8. 2.
반응형

 

 

 

 

log4jdbc

 

MySQL을 연동하여 개발하다 보면 위 화면처럼 쿼리 관련된 로그가 깔끔하게 출력되면 좋겠다는 생각을 하게 됩니다. 

쿼리 관련된 깔끔한 로그를 출력하게 되면 가독성이 좋아지기 때문에 결과를 한눈에 볼 수 있어서 개발 환경이 더욱 좋아지게 됩니다.

 

이를 위해 log4jdbc를 사용하여 로그를 출력하는 방법에 대해 알아보도록 하겠습니다.

 

 

Spring Framework에 MySQL 연동하는 방법은 이전 글을 통해 확인하시기 바랍니다.

 

 

Spring Framework 개발 환경에서 MySql 적용하기

오늘은 스프링 프레임워크를 구축한 후 MySql을 연동하는 방법을 알아보도록 하겠습니다. 스프링 프레임워크 구축 방법은 이전 글을 참고하시기 바랍니다. 1. pom.xml 설정 2. web.xml 설정 3. dao.java 추

itstudy402.tistory.com

 

 

 

 

 

1. pom.xml 설정 

 

pom.xml 파일에 dependency를 추가합니다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j-impl</artifactId>
    <version>2.4</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.4</version>
    <exclusions>
        <exclusion>
            <artifactId>log4j-api</artifactId>
            <groupId>org.apache.logging.log4j</groupId>
        </exclusion>
    </exclusions>
</dependency>
 
<dependency>
    <groupId>org.bgee.log4jdbc-log4j2</groupId>
    <artifactId>log4jdbc-log4j2-jdbc4</artifactId>
    <version>1.16</version>
</dependency>
cs

 

 

2. driverClassName / url 설정 

 

mysql 드라이버 클래스와 url을 변경해야 합니다. 


2-1. driverClassName

net.sf.log4jdbc.sql.jdbcapi.DriverSpy

 

2-2. url 

jdbc:log4jdbc:mysql://127.0.0.1:3306/dbName
** IP, 포트, 스키마명은 각자 상황에 맞게 작성합니다.

 

 

반응형

 

3. log4j2.xml 추가 

 

log4j2.xml 파일을 생성하여 아래 내용을 작성합니다.

그리고 생성을 완료한 파일은 [resources] 폴더에 위치시킵니다. 

 

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
 
    <Appenders>
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
        
           <RollingFile name="file" fileName="/filePath/logs.log" filePattern="/filePath/WAS.%i.%d{yyyy-MM-dd}.log">
               <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
               <Policies>
                   <SizeBasedTriggeringPolicy size="100MB"/>
               </Policies>
               <DefaultRolloverStrategy max="10000" fileIndex="min" />
           </RollingFile>
    </Appenders>
    
    <Loggers>
 
        <Logger name="testProject.com" level="debug" additivity="false">
            <AppenderRef ref="console"/>
            <AppenderRef ref="file" />
        </Logger>
        <Logger name="testProject.framework" level="debug" additivity="false">
            <AppenderRef ref="console"/>
            <AppenderRef ref="file" />
        </Logger>
        <Logger name="org.mybatis" level="debug" additivity="false">
            <AppenderRef ref="console"/>
            <AppenderRef ref="file" />
        </Logger>
        <Logger name="testMapper" level="debug" additivity="false">
            <AppenderRef ref="console"/>
            <AppenderRef ref="file" />
        </Logger>
        
        
        <Logger name="org.springframework" level="warn" additivity="false">
            <AppenderRef ref="console" />
            <AppenderRef ref="file" />
        </Logger>
        <Logger name="org.apache" level="warn" additivity="false">
            <AppenderRef ref="console" />
            <AppenderRef ref="file" />
        </Logger>
        
        
        <!-- SQL 로그 출력 -->
        <Logger name="jdbc.sqlonly" level="DEBUG" additivity="false">
            <AppenderRef ref="console" />
            <AppenderRef ref="file" />
        </Logger>
        <Logger name="jdbc.resultsettable" level="DEBUG" additivity="false">
            <AppenderRef ref="console" />
            <AppenderRef ref="file" />
        </Logger>
        
    </Loggers>
    
</Configuration>
cs

 

filePath항목과 

<Logger> 태그의 name 항목을 각자 상황에 맞게 수정하여 사용해야 합니다. 

 

log4j2.xml 설정에 대한 자세한 내용은 추후 포스팅하도록 하겠습니다.

 

 

 

 

4. log4jdbc.log4j2.properties

 

log4jdbc.log4j2.properties 파일을 생성하여 아래 내용을 작성합니다.

이 파일 또한 [resources] 폴더에 위치시킵니다. 

 

log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
log4jdbc.dump.sql.maxlinelength=0
log4jdbc.drivers=com.mysql.cj.jdbc.Driver
log4jdbc.auto.load.popular.drivers=false

 

5. 테스트 

 

Service 단에서 간단하게 테스트해보도록 하겠습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import java.util.HashMap;
import java.util.Map;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
 
import springTest.com.test.dao.CommonDAO;
 
@Service
public class TestService {
    
    @Autowired private CommonDAO commonDAO;
    
    public void dbtest() 
    {
        Map<String, Object> map = new HashMap<String, Object>();
        
        commonDAO.selectList("testMapper.selectTest", map);
    }
    
}
cs

 

 

결과

 

2022-08-02 15:35:43.127 [http-bio-8080-exec-24] DEBUG testMapper.selectTest - ==>  Preparing: /* MySQL select TEST */ SELECT * FROM test_table 
2022-08-02 15:35:43.167 [http-bio-8080-exec-24] DEBUG testMapper.selectTest - ==> Parameters: 
2022-08-02 15:35:43.172 [http-bio-8080-exec-24] DEBUG jdbc.sqlonly -  org.apache.commons.dbcp.DelegatingPreparedStatement.execute(DelegatingPreparedStatement.java:172)
9. /* MySQL select TEST */
SELECT
  *
FROM test_table
2022-08-02 15:35:43.188 [http-bio-8080-exec-24] INFO  jdbc.resultsettable - 
|----|------|
|idx |value |
|----|------|
|1   |test1 |
|2   |test2 |
|3   |test3 |
|----|------|
2022-08-02 15:35:43.191 [http-bio-8080-exec-24] DEBUG testMapper.selectTest - <==      Total: 3

 

Mapper에 작성했던 주석까지 표시가 되니 더욱 편리합니다. 

 

 

각자 상황에 맞게 테스트해보시고 사용하시기 바랍니다.

 

 

 

 

728x90
반응형