Notice
Recent Posts
Recent Comments
Link
«   2026/07   »
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
Tags
more
Archives
Today
Total
관리 메뉴

어리바리 신입 개발자의 얼렁뚱땅 개발 기록 ✨

23.06.19 / 데이터 베이스 연결과 로그 (log4jdbc) 본문

Back - end/SPRINGBOOT

23.06.19 / 데이터 베이스 연결과 로그 (log4jdbc)

낫쏘링 2023. 6. 19. 10:05
728x90

프로젝트 생성

#서버포트 설정
server.port=80

#thymeleaf cache 설정(새로고침 반영)
spring.thymeleaf.cache=false

#db 연결 설정
spring.flyway.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
spring.datasource.url=jdbc:log4jdbc:mysql://localhost:3306/ksmart47db_basic?serverTimezone=UTC$characterEncodeing=UTF8
spring.datasource.username=ksmart47id
spring.datasource.password=ksmart47pw

# log-back file 설정
logging.config=classpath:logback-spring.xml

 

라이브러리 추가

<!-- https://mvnrepository.com/artifact/org.bgee.log4jdbc-log4j2/log4jdbc-log4j2-jdbc4.1 -->
<dependency>
    <groupId>org.bgee.log4jdbc-log4j2</groupId>
    <artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
    <version>1.16</version>
</dependency>	
<!-- https://mvnrepository.com/artifact/nz.net.ultraq.thymeleaf/thymeleaf-layout-dialect -->
<dependency>
    <groupId>nz.net.ultraq.thymeleaf</groupId>
    <artifactId>thymeleaf-layout-dialect</artifactId>
</dependency>

 

 

[ Log4j ]

Logback 설정 : 로깅 구현체

 

logback-spring.xml

log level의 종류 (보통 debug, info 설정 / 배포할 때는 보통 error)

trace로 설정하면 trace 하위의 모든 정보가 찍힘(debug, info, warn, error, fatal)

warn으로 설정하면 warn 하위의 모든 정보가 찍힘(error, fatal)

  • trace : 신규 추가된 레벨. 디버그 레벨이 너무 광범위한 것을 해결하기 위해 좀 더 상세한 상태를 나타냄
  • debug : 개발 시 디버그 용도로 사용한 메시지
  • info : 로그인, 상태 변경과 같은 정보 메시지 
  • warn : 처리 가능한 문제, 향후 에러의 원인이 될 수 있는 경고 메시지
  • error : 요청을 처리하는 중 문제가 발생한 상태
  • fatal : 아주 심각한 에러가 발생한 상태
<?xml version="1.0" encoding="UTF-8"?>
<!--  
	jdbc.sqlonly    : Logs only SQL
	jdbc.sqltiming  : Logs the SQL, post-execution, including timing execution statistics
	jdbc.audit      : Logs ALL JDBC calls except for ResultSets
	jdbc.resultset  : all calls to ResultSet objects are logged
	jdbc.connection : Logs connection open and close events
-->
<configuration>
	<!-- 변수 지정 -->
	<!-- LOG_DIR : 로그 디렉토리 위치 / LOG_PAHT_NAME : 로그 패스 설정 -->
    <property name="LOG_DIR" value="src/main/resources/logs" />
    <property name="LOG_PATH_NAME" value="${LOG_DIR}/application.log" />
	
	<!-- ConsoleAppender -->
	<!-- 콘솔에 출력하는 형식 / -5level : 로그의 레벨  -->
	<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
		<encoder>
			<pattern>%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</pattern>
		</encoder>
	</appender>
	<!--Query ConsoleAppender -->
	<appender name="QSTDOUT" class="ch.qos.logback.core.ConsoleAppender">
		<encoder>
			<pattern>%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} %n    %msg%n</pattern>
		</encoder>
	</appender>
	
	<!-- Rolling File Appender
    <appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        	파일 경로
        <file>${LOG_PATH_NAME}</file>
        	출력패턴
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
        Rolling 정책
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_DIR}/application.%d{yyyy-MM-dd}_%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                	파일당 최고 용량 10MB
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            	일자별 로그파일 최대 보관주기(일단위)만약 해당 설정일 이상된 파일은 자동으로 제거
            <maxHistory>30</maxHistory>
        </rollingPolicy>
    </appender> -->
	
	<!-- 프로젝트 패키지 안 클래스에 설정된 로그 출력 -->
	<!-- ksmart.mybatis : 패키지 이름 -->
	<!-- level="INFO" : INFO 레벨일 것은 모두 로그에 찍는다. -->
	<!-- additivity="false" 로그를 한 번 만 찍겠다. true : 두 번 찍힘 -->
	<!-- level="OFF" : 로그 OFF -->
	<logger name="ksmart.mybatis" level="INFO" additivity="false">
		<!-- 위에서 작성해뒀던 STDOUT를 찍겠다. appender-ref 태그 없으면 안 찍힘 -->
		<appender-ref ref="STDOUT" />
	</logger>
	<!-- 아직 싱글톤 안나가서 하지 않는 것이 맞음 -->
	<logger name="org.springframework" level="OFF" additivity="false">
		<appender-ref ref="STDOUT" />
	</logger>

	<!-- log4jdbc 옵션 설정 --> 
	<!-- 모든 로그를 찍겠다. -->
	<logger name="jdbc" level="OFF" additivity="false">
		<appender-ref ref="STDOUT" />
	</logger> 
	
	<!-- 커넥션 open close 이벤트만 로그 --> 
	<logger name="jdbc.connection" level="OFF" additivity="false">
		<appender-ref ref="STDOUT" />
	</logger> 
	
	<!-- SQL문만을 로그로 남기며, PreparedStatement일 경우 관련된 argument 값으로 대체된 SQL문 출력 --> 
	<logger name="jdbc.sqlonly" level="OFF" additivity="false">
		<appender-ref ref="STDOUT" />
	</logger> 
	
	<!-- SQL문과 해당 SQL을 실행시키는데 수행된 시간 정보(milliseconds)를 포함하여 출력. --> 
	<logger name="jdbc.sqltiming" level="INFO" additivity="false">
		<appender-ref ref="QSTDOUT" />
	</logger> 
	
	<!-- ResultSet을 제외한 모든 JDBC 호출 정보를 로그 출력, 많은 양의 로그가 생성되므로 특별히 JDBC 문제를 추적해야 할 필요가 있는 경우를 제외하고는 권장 안함. --> 
	<!-- ResultSet : select의 실행 결과 -->
	<logger name="jdbc.audit" level="OFF" additivity="false">
		<appender-ref ref="STDOUT" />
	</logger> 
	
	<!-- ResultSet을 포함한 모든 JDBC 호출 정보를 로그로 남기므로 매우 방대한 양의 로그가 생성된다. --> 
	<logger name="jdbc.resultset" level="OFF" additivity="false">
		<appender-ref ref="STDOUT" />
	</logger> 
	
	<!-- SQL 결과 조회된 데이터의 table로 표현하여 로그 출력 --> 
	<logger name="jdbc.resultsettable" level="INFO" additivity="false">
		<appender-ref ref="STDOUT" />
	</logger>

	<!-- 필수로 들어가야 한다. -->
	<root level="ERROR">
		<appender-ref ref="STDOUT" />
	</root>
</configuration>

 

logback-spring.xml
0.00MB

 

쿼리 로그 정렬

log4jdbc.log4j2.properties

# 필수항목
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator

# 선택항목 (sql 쿼리를 몇 줄 출력?) 0 : 전체 sql 쿼리문 노출
log4jdbc.dump.sql.maxlinelength=0

# 드라이버 자동 로딩 취소
#log4jdbc.auto.load.popular.drivers=false

log4jdbc.log4j2.properties
0.00MB

 

 

 

데이터베이스 인코딩 확인

 

728x90