SQL Looger

yihyun·2024년 11월 14일

Spring Boot

목록 보기
29/33
post-thumbnail

SQL Looger

  • Logger 를 SQL 문에도 적용할 수 있는데
  • 이를 위해 log4jdbc 라이브러리가 필요하다.
  1. 저 2개의 파일을 resources 안에 넣어주면 된다.

이후 ▼

  1. pom.xml에 라이브러리를 추가해준다.
    https://mvnrepository.com/artifact/org.bgee.log4jdbc-log4j2/log4jdbc-log4j2-jdbc4.1
    (1.16 사용)
<!-- 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>

2. application.properties DB 설정 변경

spring.datasource.username=web_user
spring.datasource.password=pass
spring.datasource.url=jdbc:log4jdbc:mariadb://localhost:3306/mydb
spring.datasource.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy

우리가 그동안 사용했던 DB는 log4jdbc.log4j2.properties 에 들어가 있다.

  1. logback-spring.xml 에 초기 설정 변경
  • 이건 그동안 찍고 있던 로그의 설정을 할 수 있다.
  • 설정을 안할 경우 기본형으로 사용된다.
	<!-- SQL LOG 옵션 설정 (쿼리문과 걸린시간, 결과를 보도록 한다.)-->	
	<!-- 커넥션의 연결과 종료를 로그에 남김 -->
	<logger name="jdbc.connection" level="INFO"/>
	<!-- 실행되는 쿼리문을 로그로 남김 -->
	<logger name="jdbc.sqlonly" level="OFF"/>
	<!-- 쿼리문 + 걸린 시간 (이게 있어서 위에를 OFF로 설정함)-->
	<logger name="jdbc.sqltiming" level="INFO"/>
	<!-- 쿼리를 수행하기 까지의 상세한 내용 하나하나 다 남김(로그가 많이 길어진다.) -->
	<logger name="jdbc.audit" level="OFF"/>
	<!-- select 수행시 결과인 resultSet 을 보여준다. -->
	<logger name="jdbc.resultset" level="OFF"/>
	<!-- 결과값을 테이블(표) 형식으로 보여준다. (이게 있어서 위에를 OFF로 설정함) 너무 많으면 OFF로 설정-->
	<logger name="jdbc.resultsettable" level="INFO"/>	

   	<!-- Root Logger -->
   	<!-- TRACE > DEBUG > INFO > WARN(경고) > FATAL(진짜 에러) 순서로 찍어준다 -->
	<root level="INFO">
		<appender-ref ref="console" />
		<appender-ref ref="file" />
	</root>

이후 프로젝트를 실행해 보면

  • Connection opened : 커넥션 연결 (기본 설정이 10개라서 10개가 나온다.)
  • INFO 24-11-14 14:18:45 [sqltiming:373] - SELECT * FROM bbs ORDER BY idx DESC {executed in 3 msec} : 쿼리문 + 실행 시간
  • Total: 734 : 총 행 수
  • Completed 200 OK : 상태

C드라이브에 logs 라는 폴더에 server.log 파일을 확인하면 로그를 확인할 수 있다.
(▼ 위에 대한 설정 코드)

	<!-- 로그의 파일 저장 -->
	<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<!-- 저장 위치 -->
		<file>C:/logs/server.log</file>
		<!-- 출력 패턴 -->
		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
			<pattern>${LOG_PATTERN}</pattern> 		
		</encoder>
		<!-- 롤링 정책(언제 끊어서 말아줄 것인가) -->
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<!-- 어떤 이름으로 저장 할래? -->
			<fileNamePattern>C:/logs/server.%d{yy-MM-dd}.log</fileNamePattern>
			<!-- 얼마나 저장할래?(기본 : 일단위) 용량 단위로 끊을 수 있다. -->
		</rollingPolicy>
	</appender>

❗ 주의사항
이 로그가 윈도우에서 저장될 수도 있고, 리눅스에도 저장될 수도 있는데 리눅스는 C드라이브가 없기 때문에 별도로 따로 설정이 필요하다.

로그 패턴

	<!-- 패턴 등록 -->
	<!-- INFO  24-05-27 12:09:05[http-nio-8080-exec-2] [BoardController:28] - list 요청 -->
	<!-- 
    // - 왼쪽 정렬 , + 오른쪽 정렬
	%-5 : 좌측정렬 5자(5자가 안되면 나머지는 공백처리)
	level : 로그레벨 
	%d : 로그의 기록 시간
	{yy-MM-dd HH:mm:ss} : 기록패턴
	[%thread] :프로그램을 실행시키고 있는 스레드 <!--[http-nio-8080-exec-2]  이 부분이 스레드 -->
	[%logger{0}: 로거의 소스 단계(수정가능) *어디 클래스까지만 보여줄지, 패키지까지 보여줄지 등..
	%line] : 로그가 찍힌 소스의 라인수
	 - %msg : 메시지
	%n : 개행(줄바꿈)	
    %C : 해당 클래스의 풀 경로 <!-- [%logger{0} 를 대신해서 사용 가능 -->
    %M : 실행한 메서드 명
	 -->
     
	<property name="LOG_PATTERN" value="%-5level %d{yy-MM-dd HH:mm:ss} [%logger{0}:%line %M] - %msg%n"/>
여기에서 [main] → main 스레드가 하는 일 / [http-nio-8080-exec-n] → n 번 스레드가 일을 처리 했다는 것을 확인할 수 있다.
profile
개발자가 되어보자

0개의 댓글