SLF4J + Log4j2 + Log4jdbc 통합 설정 가이드: Spring/JAVA SQL 로깅 완전 정리
현대의 Java / Spring 애플리케이션에서는 로그를 일관되게 수집하고 분석하는 것이 매우 중요합니다. SLF4J를 로깅 추상화 계층으로 쓰고 Log4j2를 실제 구현체로 연결하면 안정적이고 확장성 있는 로깅 체계를 구축할 수 있습니다. 또한 Log4jdbc를 함께 사용하면 JDBC 레벨에서 실행된 SQL과 바인딩 값, 실행 시간을 손쉽게 캡처할 수 있습니다.
이 문서에서는 SLF4J + Log4j2 + Log4jdbc 통합 설정 가이드: Spring/JAVA SQL 로깅 완전 정리 라는 목표로, Maven 의존성, log4j2 구성 파일, 그리고 DataSource 적용 방법을 실제 예제와 함께 단계별로 설명합니다. 운영 환경과 개발 환경 모두에서 활용할 수 있도록 실용적인 팁도 포함했습니다.
1. 📦 Maven 의존성 설정 (pom.xml)
먼저 Maven 프로젝트에 필요한 라이브러리를 추가해야 합니다. SLF4J는 로깅 호출을 표준화하고, Log4j2는 고성능의 실제 로깅 엔진을 제공합니다. Log4jdbc는 JDBC 호출을 가로채 SQL과 파라미터를 로그로 남겨 디버깅과 분석을 쉽게 해줍니다.
1.1. 버전 정의 (Properties)
중앙에서 관리하기 쉽게 <properties>에 라이브러리 버전을 선언해 두는 것을 권장합니다.
<properties>
<slf4j.version>1.7.6</slf4j.version>
<log4j.version>2.0-rc1</log4j.version>
</properties>
1.2. SLF4J + Log4j2 + Log4jdbc 의존성
아래 의존성은 SLF4J API, Log4j2 바인딩·코어, 그리고 Log4jdbc를 포함한 최소 구성 예시입니다.
<dependencies>
<!-- 1. SLF4J API (로그 추상화 계층) -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- 2. Log4j2 Binding (SLF4J를 Log4j2에 연결) -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>${log4j.version}</version>
</dependency>
<!-- 3. Log4j2 API & Core (실제 로깅 구현체) -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j.version}</version>
</dependency>
<!-- 4. Log4jdbc-log4j2 (JDBC 프록시 + Log4j2 연동) -->
<dependency>
<groupId>org.bgee.log4jdbc-log4j2</groupId>
<artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
<version>1.16</version>
</dependency>
</dependencies>
- 애플리케이션 코드에서는 항상
org.slf4j.Logger와LoggerFactory를 사용하세요. log4j-slf4j-impl이 SLF4J 호출을 Log4j2로 전달합니다.- Log4jdbc는 JDBC 인터셉터 역할을 하므로 코드 변경 없이 SQL 로그를 얻을 수 있습니다.
2. ⚙️ Log4j2 설정 (log4j2.xml)
SQL 로그와 애플리케이션 로그를 분리해 출력하면 문제 원인을 빠르게 파악할 수 있습니다. 아래 설정 예시는 Log4jdbc가 생성하는 SQL 로그는 별도의 포맷으로, 나머지 로그는 일반 포맷으로 출력하도록 구성한 것입니다.
2.1. SQL 관련 Logger 설정
Log4jdbc가 사용하는 jdbc.sqltiming과 java.sql 같은 로거를 별도로 정의하면 유용합니다.
<Loggers>
<!-- Log4jdbc 쿼리 실행 시간 및 SQL 타이밍 -->
<Logger name="jdbc.sqltiming" level="INFO" additivity="false">
<AppenderRef ref="console_com" />
</Logger>
<!-- 일반 JDBC 로거 (필요 시 활성화) -->
<Logger name="java.sql" level="INFO" additivity="false">
<AppenderRef ref="console_com" />
</Logger>
<!-- 스프링 및 사용자 패키지 로거 예시 -->
<Logger name="egovframework" level="INFO" additivity="false">
<AppenderRef ref="console" />
</Logger>
<Logger name="org.springframework" level="INFO" additivity="false">
<AppenderRef ref="console" />
</Logger>
<!-- 기본 루트 로거 -->
<Root level="INFO">
<AppenderRef ref="console" />
</Root>
</Loggers>
2.2. Appender 및 출력 패턴 설정
출력 패턴을 구분하면 콘솔이나 로그 파일에서 SQL 로그를 즉시 식별할 수 있습니다. 운영에서는 SQL 전용 파일로 분리하는 것을 권장합니다.
<Appenders>
<!-- 일반 애플리케이션 로그용 콘솔 -->
<Console name="console" target="SYSTEM_OUT">
<PatternLayout pattern="%d %5p %m%n" />
</Console>
<!-- SQL / JDBC 로그용 콘솔 (로거 이름 포함) -->
<Console name="console_com" target="SYSTEM_OUT">
<PatternLayout pattern="%d %5p [%c] %m%n" />
</Console>
<!-- 파일 로깅: 10MB 기준 롤링 설정 예제 -->
<RollingFile name="file" fileName="/logs/all.log" filePattern="/logs/%i.%d{yyyy-MM-dd}.log">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
<Policies>
<SizeBasedTriggeringPolicy size="10MB" />
</Policies>
<DefaultRolloverStrategy max="1000" fileIndex="min" />
</RollingFile>
</Appenders>
3. 📡 DataSource에 Log4jdbc 적용하기
이제 실제 DataSource 설정에 Log4jdbc를 적용해 보겠습니다.
Spring Boot의 application.properties 예제를 통해 드라이버와 URL만 바꾸면 기존 코드 수정 없이 SQL 로깅을 활성화할 수 있습니다.
# 1. Driver Class 변경: 원본 드라이버 대신 Log4jdbc DriverSpy 사용
spring.datasource.driverClassName=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
# 2. JDBC URL 변경: 실제 DB URL 앞에 'jdbc:log4jdbc:' 접두사 추가
spring.datasource.url=jdbc:log4jdbc:mariadb://localhost:3306/test
DriverSpy가 JDBC 호출을 중간에서 가로채 SQL과 바인딩 값을 로깅합니다.- 접두사
jdbc:log4jdbc:는 내부에서 제거되어 실제 드라이버로 전달됩니다. - Repository나 DAO 코드를 변경하지 않아도 로그에 SQL이 출력되므로 도입이 간단합니다.
4. ✅ 마무리: 언제 이 조합을 쓰면 좋을까?
- 프로젝트 전반에서 일관된 로깅 API(SLF4J)를 적용하고 싶을 때
- 성능이 우수하고 기능이 풍부한 Log4j2의 기능을 활용하고 싶을 때
- 개발·테스트 단계에서 실제 실행된 JDBC SQL, 바인딩 값, 실행 시간을 상세히 확인해야 할 때
SLF4J + Log4j2 + Log4jdbc 통합 설정 가이드: Spring/JAVA SQL 로깅 완전 정리 관점에서 보면, 이 조합은 안정적인 로그 수집과 실전 수준의 SQL 가시성을 동시에 제공합니다. 설정은 간단하지만 얻는 이점은 큽니다. 로그 기반 디버깅, 쿼리 튜닝, 성능 분석 작업에 즉각적인 도움이 됩니다.
SLF4J + Log4j2 + Log4jdbc 통합 설정 가이드: Spring/JAVA SQL 로깅 완전 정리 — 이 가이드를 바탕으로 환경에 맞게 설정을 조정해 보세요.
© 2025 SLF4J + Log4j2 + Log4jdbc 로깅 설정 가이드. 모든 권리 보유.
함께 보면 좋은 엔터프라이즈 사례
🚀 이 주제, 우리 서비스에 어떻게 적용할까요?
SLF4J + Log4j2 + Log4jdbc 통합 설정 가이드: Spring/JAVA SQL 로깅 완전 정리를 실제 서비스와 조직에 녹여보고 싶다면, 현재 아키텍처와 운영 방식을 한 번 점검해 보는 것부터 시작해 보세요. 팀 위키나 기술 블로그, 사내 스터디 주제로도 아주 좋습니다.
이 글이 도움이 됐다면, 비슷한 엔터프라이즈 사례 글들도 함께 살펴보면서 우리 조직에 맞는 운영 상용구를 정의해 보세요.
댓글
댓글 쓰기