https://logging.apache.org/log4j/2.12.x/
Log4j – Apache Log4j 2 - Apache Log4j 2
Apache Log4j 2 Apache Log4j 2 is an upgrade to Log4j that provides significant improvements over its predecessor, Log4j 1.x, and provides many of the improvements available in Logback while fixing some inherent problems in Logback’s architecture. ## Impo
logging.apache.org
Log4jdbc는 JDBC 드라이버를 감싸서 SQL 쿼리와 실행 시간을 로그로 기록할 수 있도록 도와주는 도구입니다. 이를 사용하면 애플리케이션이 데이터베이스와 상호작용할 때 발생하는 SQL 쿼리와 쿼리 실행 시간을 손쉽게 모니터링할 수 있습니다. 아래는 Log4jdbc 사용 시 얻을 수 있는 장점입니다.
- SQL 쿼리 기록 : 실제로 실행된 SQL 쿼리를 로그로 출력해 디버깅과 모니터링에 유용합니다.
- 쿼리 실행 시간 측정 : 각 SQL 쿼리가 얼마나 시간이 걸리는지 로그로 확인할 수 있어, 성능 분석에 도움을 줍니다.
- 결과 로그 출력 : 쿼리 실행 결과도 로그로 남길 수 있어, 디버깅 시 유용합니다.
1️⃣ build.gradle 의존성 추가
Log4jdbc를 사용하기 위해 `build.gradle` 파일에 의존성 추가
* 전체 경로: /build.gradle
dependencies {
implementation 'org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4.1:1.16' // Log4jdbc 의존성 추가✨
}
2️⃣ application.properties 변경
`application.properties`에서 Log4jdbc 드라이버를 사용하도록 데이터베이스 연결 설정 수정
* 전체 경로: src/main/resources/application.properties
# MySQL 설정 (Log4jdbc 적용)
# spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# spring.datasource.url=jdbc:mysql://localhost:3306/spring?serverTimezone=Asia/Seoul
# Log4jdbc를 적용한 MySQL 설정✨
spring.datasource.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
spring.datasource.url=jdbc:log4jdbc:mysql://localhost:3306/spring?serverTimezone=Asia/Seoul
# PostgreSQL 설정 (Log4jdbc 적용)
# spring.datasource.driver-class-name=org.postgresql.Driver
# spring.datasource.url=jdbc:postgresql://localhost:5432/spring
# Log4jdbc를 적용한 PostgreSQL 설정✨
spring.datasource.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
spring.datasource.url=jdbc:log4jdbc:postgresql://localhost:5432/spring
3️⃣ log4jdbc.log4j2.properties 생성
`log4jdbc.log4j2.properties` 파일 생성(Log4jdbc 설정 추가)
* 전체 경로: src/main/resources/log4jdbc.log4j2.properties
# SLF4J 로그 대리자 설정✨
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
# SQL 로그의 최대 줄 길이 설정✨ (0은 제한 없음)
log4jdbc.dump.sql.maxlinelength=0
4️⃣ logback.xml 생성
`logback.xml` 파일 생성(로그 출력 형식 설정)
* 전체 경로: src/main/resources/logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 콘솔에 로그를 출력하기 위한 STDOUT 앱ender 정의 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- 로그 출력 형식 정의: 날짜, 스레드 이름, 로그 레벨, 로거 이름, 메시지 -->
<pattern>%d{yyyyMMdd HH:mm:ss.SSS} [%thread] %-3level %logger{5} - %msg %n</pattern>
</encoder>
</appender>
<!-- JDBC 관련 로그 설정✨ -->
<logger name="jdbc" level="OFF"/> <!-- JDBC 호출에 대한 로그를 출력하지 않음 -->
<logger name="jdbc.sqlonly" level="OFF"/> <!-- SQL문만 로그로 남기기 (OFF로 설정되어 출력되지 않음) -->
<logger name="jdbc.sqltiming" level="DEBUG"/> <!-- SQL문 및 실행 시간 로그 (DEBUG 레벨로 설정) -->
<logger name="jdbc.audit" level="OFF"/> <!-- JDBC 호출 정보 로그 (OFF로 설정되어 출력되지 않음) -->
<logger name="jdbc.resultset" level="OFF"/> <!-- ResultSet 포함 JDBC 호출 로그 (OFF로 설정되어 출력되지 않음) -->
<logger name="jdbc.resultsettable" level="DEBUG"/> <!-- SQL 결과 조회 데이터 로그 (DEBUG 레벨로 설정) -->
<logger name="jdbc.connection" level="OFF"/> <!-- JDBC 연결 로그 (OFF로 설정되어 출력되지 않음) -->
<!-- 루트 로거 설정: 기본 로그 레벨은 INFO -->
<root level="INFO">
<appender-ref ref="STDOUT" /> <!-- STDOUT 앱ender를 루트 로거에 연결 -->
</root>
<!-- 로그 레벨 조정 가능성✨ -->
<!--
로그 레벨은 TRACE, DEBUG, INFO, WARN, ERROR, OFF의 6가지가 있으며,
필요에 따라 조정할 수 있습니다.
- TRACE: 가장 상세한 로그
- DEBUG: 디버깅을 위한 로그
- INFO: 일반적인 정보 로그
- WARN: 경고 로그
- ERROR: 오류 로그
- OFF: 로그 출력을 중지
-->
</configuration>
💡 로그 출력 예시
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;
import java.util.List;
@Service
public class UserService {
private static final Logger logger = LoggerFactory.getLogger(UserService.class); // Logger 선언✨
@Autowired
private EntityManager entityManager;
public List<User> findAllUsers() {
TypedQuery<User> query = entityManager.createQuery(
"SELECT u FROM User u", User.class
);
List<User> users = query.getResultList();
for (User user : users) {
logger.info("Found user: " + user.getName()); // 로깅✨
}
return users;
}
}
'☕Java' 카테고리의 다른 글
[Java] Map 사용 방법(keySet(), entrySet(), Map.entry()) (0) | 2024.09.01 |
---|---|
[Java] JPA, JPQL, QueryDSL 개념 정리 (1) | 2024.08.22 |
[Java] Arrays.sort를 사용하여 문자열 배열을 사전순으로 정렬하는 다양한 방법(Comparator, 익명 클래스, 람다식) (0) | 2024.08.16 |
[목차] Do it! 알고리즘 코딩 테스트 자바 편 (0) | 2024.08.16 |