기본 콘텐츠로 건너뛰기

SLF4J + Log4j2 + Log4jdbc 통합 설정 가이드: Spring/JAVA SQL 로깅 완전 정리

SLF4J + Log4j2 + Log4jdbc 통합 설정 가이드: Spring/JAVA SQL 로깅 완전 정리

AI 생성 이미지: SLF4J + Log4j2 + Log4jdbc 통합 설정 가이드: Spring/JAVA SQL 로깅 완전 정리
AI 생성 이미지: 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>
            
TIP: 예제는 교육 목적의 버전을 사용합니다. 실제 프로젝트에서는 안정화된 최신 버전으로 교체하세요.

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.LoggerLoggerFactory를 사용하세요.
  • log4j-slf4j-impl이 SLF4J 호출을 Log4j2로 전달합니다.
  • Log4jdbc는 JDBC 인터셉터 역할을 하므로 코드 변경 없이 SQL 로그를 얻을 수 있습니다.

2. ⚙️ Log4j2 설정 (log4j2.xml)

SQL 로그와 애플리케이션 로그를 분리해 출력하면 문제 원인을 빠르게 파악할 수 있습니다. 아래 설정 예시는 Log4jdbc가 생성하는 SQL 로그는 별도의 포맷으로, 나머지 로그는 일반 포맷으로 출력하도록 구성한 것입니다.

2.1. SQL 관련 Logger 설정

Log4jdbc가 사용하는 jdbc.sqltimingjava.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>
        
TIP: 트래픽이 많은 환경에서는 SQL 로그 전용 Appender를 별도의 파일로 구성해 분석과 보관을 쉽게 하세요. 이렇게 하면 쿼리 분석이나 성능 진단이 훨씬 수월해집니다.

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 로깅 완전 정리를 실제 서비스와 조직에 녹여보고 싶다면, 현재 아키텍처와 운영 방식을 한 번 점검해 보는 것부터 시작해 보세요. 팀 위키나 기술 블로그, 사내 스터디 주제로도 아주 좋습니다.

이 글이 도움이 됐다면, 비슷한 엔터프라이즈 사례 글들도 함께 살펴보면서 우리 조직에 맞는 운영 상용구를 정의해 보세요.

AI 생성 이미지: SLF4J + Log4j2 + Log4jdbc 통합 설정 가이드: Spring/JAVA SQL 로깅 완전 정리
AI 생성 이미지: SLF4J + Log4j2 + Log4jdbc 통합 설정 가이드: Spring/JAVA SQL 로깅 완전 정리

댓글

이 블로그의 인기 게시물

Java Servlet Request Parameter 완전 정복 — GET/POST 모든 파라미터 확인 & 디버깅 예제 (Request Parameter 전체보기)

Java Servlet Request Parameter 완전 정복 — GET/POST 모든 파라미터 확인 & 디버깅 예제 Java Servlet Request Parameter 완전 정복 웹 애플리케이션에서 클라이언트로부터 전달되는 Request Parameter 를 확인하는 것은 필수입니다. 이 글에서는 Java Servlet 과 JSP 에서 GET/POST 요청 파라미터를 전체 출력하고 디버깅하는 방법을 다양한 예제와 함께 소개합니다. 1. 기본 예제: getParameterNames() 사용 Enumeration<String> params = request.getParameterNames(); System.out.println("----------------------------"); while (params.hasMoreElements()){ String name = params.nextElement(); System.out.println(name + " : " + request.getParameter(name)); } System.out.println("----------------------------"); 위 코드는 요청에 포함된 모든 파라미터 이름과 값을 출력하는 기본 방법입니다. 2. HTML Form과 연동 예제 <form action="CheckParamsServlet" method="post"> 이름: <input type="text" name="username"><br> 이메일: <input type="email" name="email"><b...

PostgreSQL 달력(일별,월별)

SQL 팁: GENERATE_SERIES로 일별, 월별 날짜 목록 만들기 SQL 팁: GENERATE_SERIES 로 일별, 월별 날짜 목록 만들기 데이터베이스에서 통계 리포트를 작성하거나 비어있는 날짜 데이터를 채워야 할 때, 특정 기간의 날짜 목록이 필요할 수 있습니다. PostgreSQL과 같은 데이터베이스에서는 GENERATE_SERIES 함수를 사용하여 이 작업을 매우 간단하게 처리할 수 있습니다. 1. 🗓️ 일별 날짜 목록 생성하기 2020년 1월 1일부터 12월 31일까지의 모든 날짜를 '1 day' 간격으로 생성하는 쿼리입니다. WITH date_series AS ( SELECT DATE(GENERATE_SERIES( TO_DATE('2020-01-01', 'YYYY-MM-DD'), TO_DATE('2020-12-31', 'YYYY-MM-DD'), '1 day' )) AS DATE ) SELECT DATE FROM date_series 이 쿼리는 WITH 절(CTE)을 사용하여 date_series 라는 임시 테이블을 만들고, GENERATE_SERIES 함수로 날짜를 채웁니다. 결과 (일별 출력) 2. 📅 월별 날짜 목록 생성하기 동일한 원리로, 간격을 '1 MONTH' 로 변경하면 월별 목록을 생성할 수 있습니다. TO...

CSS로 레이어 팝업 화면 가운데 정렬하는 방법 (top·left·transform 완전 정리)

레이어 팝업 센터 정렬, 이 코드만 알면 끝 (CSS 예제 포함) 이벤트 배너나 공지사항을 띄울 때 레이어 팝업(center 정렬) 을 깔끔하게 잡는 게 생각보다 어렵습니다. 화면 크기가 변해도 가운데에 고정되고, 모바일에서도 자연스럽게 보이게 하려면 position , top , left , transform 을 정확하게 이해해야 합니다. 이 글에서는 아래 내용을 예제로 정리합니다. 레이어 팝업(center 정렬)의 기본 개념 자주 사용하는 position: absolute / fixed 정렬 방식 질문에서 주신 스타일 top: 3.25%; left: 50%; transform: translateX(-50%) 의 의미 실무에서 바로 쓰는 반응형 레이어 팝업 HTML/CSS 예제 1. 레이어 팝업(center 정렬)이란? 레이어 팝업(레이어 팝업창) 은 새 창을 띄우는 것이 아니라, 현재 페이지 위에 div 레이어를 띄워서 공지사항, 광고, 이벤트 등을 보여주는 방식을 말합니다. 검색엔진(SEO) 입장에서도 같은 페이지 안에 HTML이 존재 하기 때문에 팝업 안의 텍스트도 정상적으로 인덱싱될 수 있습니다. 즉, “레이어 팝업 센터 정렬”, “레이어 팝업 만드는 방법”과 같이 관련 키워드를 적절히 넣어주면 검색 노출에 도움이 됩니다. 2. 질문에서 주신 레이어 팝업 스타일 분석 질문에서 주신 스타일은 다음과 같습니다. <div class="layer-popup" style="width:1210px; z-index:9001; position:absolute; top:3.25%; left:50%; transform:translateX(-50%);"> 레이어 팝업 내용 <...