> For the complete documentation index, see [llms.txt](https://tech.x2bee.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://tech.x2bee.com/dev-guide/pjt-prepare/framework/query-logging.md).

# Query Logging

본 문서에서는 log4jdbc 를 이용한 쿼리 로깅 방법에 대하여 기술합니다.

## log4jdbc 라이브러리 추가

* pom.xml 파일에 log4jdbc 라이브러리 의존성을 추가합니다.

{% code title="pom.xml" %}

```xml
<dependencies>
    ....
    <dependency>
        <groupId>org.bgee.log4jdbc-log4j2</groupId>
        <artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
        <version>1.16</version>
    </dependency>
</dependencies>
```

{% endcode %}

* Gradle 사용 시 build.gradle에 의존성 추가:

{% code title="build.gradle" %}

```gradle
dependencies {
    ....
    implementation 'org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4.1:1.16'
}
```

{% endcode %}

## log4jdbc 설정 파일 추가

* resources 폴더 하위에 **log4jdbc.log4j2.properties** 파일명으로 설정 파일을 추가합니다.

{% code title="log4jdbc.log4j2.properties" %}

```
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
log4jdbc.dump.sql.maxlinelength=0
```

{% endcode %}

## DB 연결 정보 수정

* driver-class-name에 다음을 추가합니다:
  * net.sf.log4jdbc.sql.jdbcapi.DriverSpy
* URL에 log4jdbc를 추가합니다.

예시 application.yml:

{% code title="application.yml" %}

```yaml
spring:
  config:
    datasource:
      testdb:
        url: dbc:log4jdbc:postgresql://xxx.xx.xx.xx:xxxx:xxxx
        driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
```

{% endcode %}

## logback 설정에 관련 로거 추가

log4jdbc 로그를 제어하기 위해 logback 설정 파일에 아래 로거들을 추가합니다. (파일명은 환경에 따라 logback.xml 또는 logback.yml을 사용)

{% code title="logback.yml / logback.xml (예시)" %}

```xml
<!-- log4jdbc 옵션 설정 -->
<logger name="jdbc" level="off"/>

<!-- 커넥션 open close 이벤트 로그로 남김 -->
<logger name="jdbc.connection" level="off"/>

<!-- SQL문만을 로그로 남기며, PreparedStatement일 경우 관련된 argument 값으로 대체된 SQL문이 보여짐 -->
<logger name="jdbc.sqlonly" level="off"/>

<!-- SQL문과 해당 SQL을 실행시키는데 수행된 시간 정보(milliseconds)를 포함 -->
<logger name="jdbc.sqltiming" level="debug"/>

<!-- ResultSet을 제외한 모든 JDBC 호출 정보를 로그로 남김. 방대한 양의 로그가 생성되므로 특별히 JDBC 문제를 추적해야 할 필요가 있는 경우를 제외하고는 사용을 권장하지 않음-->
<logger name="jdbc.audit" level="off"/>

<!-- ResultSet을 포함한 모든 JDBC 호출 정보를 로그로 남기므로 방대한 양의 로그가 생성됨 -->
<logger name="jdbc.resultset" level="off"/>

<!-- SQL 결과 조회된 데이터의 table을 로그로 남김 -->
<logger name="jdbc.resultsettable" level="debug"/>
```

{% endcode %}

(위 설정에서 level 값은 필요에 따라 조정해서 사용하세요. 일부 로거는 대량의 로그를 생성하므로 운영 환경에서는 주의가 필요합니다.)
