Log4jdbc-log4j2
SQL 과 다른 관심있는 정보를 로깅 하기위한 JDBC 프록시 드라이버
Log4jdbc-log4j2는 기본적으로 Log4j 2(또는 일반적으로 SLF4J)를 사용하도록 log4jdbc를 수정한 것으로 JDBC 4.1 에서 JDBC 3까지 지원하고 log4jdbc-remix의 모든 개선 사항을 포함하며 자체적으로 새로운 개선 사항을 제공합니다.
- 기본적으로 Log4j 2를 지원합니다. SLF4J도 사용할 수 있습니다.
- JDBC 4.1(Java 7), JDBC 4(Java 6), JDBC 3(Java 5)를 지원합니다.
- log4jdbc-remix 의 모든 개선 사항을 포함합니다 (ResultSet을 테이블로 기록할 수 있고, Datasource로 구성할 수 있으며, 플러그형 SQL Formatter를 사용할 수 있음)
- sonatype maven 저장소에서 사용할 수 있습니다.
- 자체적으로 새로운 개선 사항 제공(Connention, Opening, Closing 실행 시간, getGeneratedKeys() 쿼리 등)
장점
하나의 단일 로거
Log4j 2에서 제공하는 기능 덕분에 log4jdbc의 표준 구현에서는 5개(log4jdbc-remix를 사용할 때는 6개)와 달리 하나의 단일 로거만 구성하면 됩니다. 표준 log4jdbc 동작은 여전히 쉽게 재현할 수 있습니다(자세한 내용은 아래 참조). 그럼에도 불구하고 원하는 경우 표준 log4jdbc 구현에서와 같이 SLF4J를 사용하고 여러 로거를 구성할 수 있습니다.
log4jdbc-remix 기능
log4jdbc-remix 에서 제공하는 모든 개선 사항이 이 구현에 포함됩니다. result sets 을 테이블로 기록할 수 있고, Datasource로 구성할 수 있고, 사용자 지정 SQL 포맷터를 사용할 수 있고, sonatype maven 리포지토리에서 사용할 수 있습니다. Log4j 2를 사용하는 경우 ResultSet 의 로깅은 여전히 단일 로거로 구성할 수 있습니다. 또한 이 구현은 속성을 통해 사용자 지정 SQL 포맷터를 구성하는 추가 방법을 제공합니다(아래 참조).
JDBC 4.1 지원
log4jdbc-log4j2는 JDBC 4.1(JDK 1.7), JDBC 4(JDK 1.6), JDBC 3(JDK 1.5)을 지원합니다. JDK 1.4용 JDBC 3 버전은 제공하지 않습니다.
다양한 SQL 작업에 따른 서로 다른 파일로 쉽게 Dispatch
Log4j 2에서 제공하는 기능 덕분에 다양한 파일에서 다양한 SQL 작업(SELECT, UPDATE, ...) 또는 오류(예외 발생)를 쉽게 Dispatch 할 수 있습니다. 이는 log4jdbc의 표준 구현을 사용하여 수행할 수 없습니다.
sonatype maven 저장소에서 이용가능
log4jdbc-log4j2는 Maven 저장소를 통해 사용할 수 있습니다.
group org.bgee.log4jdbc-log4j2, artifacts log4jdbc-log4j2-jdbc3, log4jdbc-log4j2-jdbc4, log4jdbc-log4j2-jdbc4.1.
기타 개선 사항
이 구현은 연결, 열기 및 닫기를 위한 실행 시간, 수행된 SQL 쿼리와 함께 기록되는 Statement.getGeneratedKeys()에 대한 호출 등 약간의 개선을 제공합니다.
설치
설치는 log4jdbc의 표준 버전과 거의 동일합니다. 그러나 특히 다음과 같은 약간의 수정사항에 주의하세요.
- 로드할 드라이버의 이름은 표준 log4jdbc 구현과 다릅니다. ( JDBC 4 또는 JDBC 4.1 버전을 사용하는 경우 드라이버를 직접 로드할 필요가 없으며 log4jdbc-log4j2가 자동으로 검색되어 로드됩니다.)
- Log4j 2 대신 SLF4J를 사용하도록 선택한 경우 log4jdbc.spylogdelefator.name 옵션을 net.sf.log4jdbc.log.slf4j.Slf4SpyLogDelegator 값으로 구성해야 합니다 (자세한 내용은 아래 참조).
1. log4jdbc-log4j2 설치
1.1. JDBC3, JDBC 4 또는 JDBC 4.1 지원이 필요한지 결정
사용하는 JDK에 따라 다른 버전의 log4jdbc-log4j2를 설치해야 합니다.
- Java 5를 사용하는 경우 log4jdbc-log4j2의 JDBC 3 버전을 사용해야 합니다.
- Java 6의 경우 log4jdbc-log4j2의 JDBC 4 버전입니다.
- Java 7의 경우 log4jdbc-log4j2의 JDBC 4.1 버전입니다.
JDBC 버전이 아니라 사용하는 JDK 버전에 따라 선택해야 합니다. 예를 들어 log4jdbc JDBC 4 드라이버는 지원되지 않는 메서드를 호출하지 않는 한 JDBC 3 또는 이전 드라이버를 래핑할 수 있습니다.
1.2. option 1: 직접 다운로드를 통한 설치
드라이버 .jar 파일 중 하나를 선택하고 다운로드합니다.
- JDK 1.5에서 JDBC 3 지원을 위한 log4jdbc-log4j2-jdbc3.jar . 버전 beta5부터 Log4j 2는 JDK 1.6을 사용하여 컴파일되므로 JDBC3용 log4jdbc-log4j2는 Log4j 2 beta4 이후 버전에서 사용할 수 없습니다.
- JDK 1.6에서 JDBC 4 지원을 위한 log4jdbc-log4j2-jdbc4.jar
- JDK 1.7에서 JDBC 4.1 지원을 위한 log4jdbc-log4j2-jdbc4.1.jar
선택한 log4jdbc-log4j2 jar를 애플리케이션의 클래스 경로에 배치합니다.
1.3. option 2: Maven 저장소를 통한 설치
pom.xml 구성 파일에 다음을 추가하고 log4jdbc-log4j2-jdbcXX 사용하려는 JDBC 버전에 해당하는 값( log4jdbc-log4j2-jdbc4.1, 또는 log4jdbc-log4j2-jdbc4, 또는 log4jdbc-log4j2-jdbc3)으로 바꿉니다.
<dependency>
<groupId>org.bgee.log4jdbc-log4j2</groupId>
<artifactId>log4jdbc-log4j2-jdbcXX</artifactId>
<version>1.16</version>
</dependency>
2. 사용하려는 로깅 라이브러리를 설치합니다.
2.1. Logj 2 를 사용하려는 경우(권장)
다운로드 페이지 또는 Maven 리포지토리 (이 링크에는 pom.xml 파일을 구성하는 지침이 포함되어 있음) 에서 Log4j 2의 최신 버전을 가져옵니다 .
일반적으로 log4j-core 및 log4j-api 라이브러리를 설치해야 합니다. 버전 beta5부터 Log4j 2는 JDK 1.6을 사용하여 컴파일되므로 JDBC3용 log4jdbc-log4j2는 Log4j 2 beta4 이후 버전에서 사용할 수 없습니다.
2.2. SLF4J를 사용하려면
다운로드 페이지 또는 Maven 저장소 에서 SLF4J의 최신 버전을 다운로드하십시오.
slf4j-api 라이브러리와 선택한 Java 로깅 시스템(예: Log4j, java.util 로깅, logback, Jakarta Commons Logging)에 따라 선택하는 라이브러리의 두 개 이상의 라이브러리가 필요합니다.
3. 소스 코드 수정
3.1. JDBC URL 변경
사용 중인 일반 JDBC URL 앞에 jdbc:log4를 추가합니다 . 예를 들어 정상적인 JDBC URL이 다음과 같은 경우:
jdbc:derby://localhost:1527//db-derby-10.2.2.0-bin/databases/MyDatabase
다음과 같이 변경합니다.
jdbc:log4jdbc:derby://localhost:1527//db-derby-10.2.2.0-bin/databases/MyDatabase
3.2. 사용된 드라이버 변경
애플리케이션에서 JDBC 드라이버 클래스를 net.sf.log4jdbc.sql.jdbcapi.DriverSpy 로 설정합니다(표준 log4jdbc 구현에서와 동일한 클래스 이름이 아님에 유의하십시오). 지원되는 드라이버 목록이나 다른 드라이버에 대한 지원을 추가하는 방법은 log4jdbc 설명서를 참조하십시오 . log4jdbc는 거의 모든 주요 드라이버를 지원합니다.
JDBC 4 또는 JDBC 4.1 버전을 사용하는 경우 실제로 드라이버를 로드하도록 설정할 필요가 없습니다. 예를 들어 Class.forName("net.sf.log4jdbc.sql.jdbcapi.DriverSpy") 드라이버가 자동으로 검색되어 로드됩니다.
4. Logger 설정
4.1. Log4j 2 를 사용하는 경우
Log4jdbc-log4j2는 log4jdbc.log4j2 라는 하나의 로거만 사용합니다 (표준 구현에서는 5개를 사용하고 log4jdbc-remix를 사용할 때는 6개도 사용함).
Log4j 2 구성 파일(log4j2.xml)에서 설정할 수 있습니다. 이 문서는 몇 가지 예를 제공합니다(아래 "사용법" 참조). log4jdbc 및 log4jdbc-remix의 표준 구현에서 제공하는 거의 모든 기능은 마커 사용 덕분에 이 단일 로거를 사용하여 재현할 수 있습니다 .
예를 들어 ERROR 수준에서 매우 간단한 구성이 가능합니다.
<logger name="log4jdbc.log4j2" level="error" additivity="false">
<appender-ref ref="Console"/>
</logger>
이 로거는 Marker 를 사용하여 쉽게 구성할 수 있습니다. 사용 방법 또는 log4jdbc 및 log4jdbc-remix 표준 동작을 재현하는 방법에 대한 몇 가지 예는 아래 "사용" 섹션을 참조하세요. INFO 또는 DEBUG 수준에서 권장되는 구성은 기본적으로 다음과 같습니다.
<logger name="log4jdbc.log4j2" level="info" additivity="false">
<MarkerFilter marker="LOG4JDBC_OTHER" onMatch="DENY" onMismatch="NEUTRAL"/>
<appender-ref ref="Console"/>
</logger>
이 로거가 꺼져 있으면(또는 예를 들어 FATAL 수준과 같이 오류보다 낮은 수준으로 설정되면) log4jdbc는 아무 것도 기록하지 않으며 실제로 기본 데이터베이스에 대한 연결은 log4jdbc 드라이버 입니다.(따라서 log4jdbc를 설치하고 사용하지 않을 때 실제 성능 손실 없이 실행 시간에 즉시 켤 수 있음).
사용 가능한 모든 마커 목록
- LOG4JDBC_EXCEPTION: 모든 SQLException과 연관됩니다. 이는 ERROR 수준의 느린 쿼리 로깅 기능이 활성화된 경우에 유용합니다.
- LOG4JDBC_SQL: SQL 문과 연결됩니다( 모든 statements, select, update, insert, delete 또는 create과 drop). 다음 마커의 부모:
- LOG4JDBC_SELECT: SELECT 작업을 수행하는 SQL 문과 연결됩니다.
- LOG4JDBC_UPDATE: UPDATE 작업을 수행하는 SQL 문과 연결됩니다.
- LOG4JDBC_INSERT: INSERT 작업을 수행하는 SQL 문과 연결됩니다.
- LOG4JDBC_DELETE: DELETE 작업을 수행하는 SQL 문과 연결됩니다.
- LOG4JDBC_CREATE: CREATE 작업을 수행하는 SQL 문과 연결됩니다.
- LOG4JDBC_NON_STATEMENT: SQL 문이 아닌 모든 JDBC 호출 및 result sets 을 테이블로 로깅하는 것과 연결됩니다(log4jdbc-remix 기능). 다음 마커의 부모:
- LOG4JDBC_CONNECTION: connection, open, close 및 abort 이벤트를 기록하고 열려 있는 모든 connection 번호를 덤프합니다(연결 누수 문제를 찾는 데 유용함).
- LOG4JDBC_OTHER: ResultSet에 대한 호출을 포함하여 모든 JDBC 호출과 연결되고 result sets 을 테이블로 로깅합니다(log4jdbc-remix 기능). 다음 마커의 부모:
- LOG4JDBC_JDBC: ResultSet에 대한 호출을 포함하여 모든 JDBC 호출과 연관됩니다. 다음 마커의 부모:
- LOG4JDBC_AUDIT: ResultSet에 대한 호출을 제외한 JDBC 호출과 연관됩니다. 이것은 매우 방대한 출력이며 특정 JDBC 문제를 추적하지 않는 한 일반적으로 필요하지 않습니다.
- LOG4JDBC_RESULTSET: ResultSet에 대한 호출과 연결됩니다. ResultSet 개체에 대한 모든 호출이 기록되기 때문에 훨씬 더 방대한 로그를 생성합니다.
- LOG4JDBC_RESULTSETTABLE: JDBC ResultSets를 테이블로 기록하기 위한 마커입니다. log4jdbc-remix에서 상속된 기능(log4jdbc-remix 구현의 jdbc.resultsettable 로거에 해당)
- LOG4JDBC_JDBC: ResultSet에 대한 호출을 포함하여 모든 JDBC 호출과 연관됩니다. 다음 마커의 부모:
4.2. SLF4J를 사용하는 경우
4.2.1 log4jdbc.spylogdelegator.name 옵션 설정
log4jdbc.spylogdelegator.name 옵션을 net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator 값으로 구성해야 합니다. 이는 클래스 경로에 저장된 log4jdbc.log4j2.properties 파일 또는 시스템 속성을 통해 수행됩니다 .
log4jdbc.log4j2.properties 파일에 다음을 추가합니다.
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
또는 시스템 속성을 사용하세요.
java -Dlog4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator -classpath ./classes my.funky.Program
log4jdbc-log4j2의 옵션을 구성하는 방법에 대한 자세한 내용은 아래를 참조하십시오(특히 log4jdbc.spylogdelegator.name 옵션을 사용하면 사용자 지정 SQL 포맷터를 설정할 수 있음).
4.2.2. Logger 구성
log4jdbc 및 log4jdbc-remix 문서에서: 6개의 로거가 사용됩니다. 6개가 모두 꺼져 있으면(또는 예를 들어 log4j의 FATAL 수준과 같이 오류보다 낮은 수준으로 설정되면) log4jdbc는 아무 것도 기록하지 않으며 log4jdbc 드라이버에 의해 실제로 기본 데이터베이스에 대한 연결이 반환됩니다. (따라서 log4jdbc를 설치하고 사용하지 않을 때 실제 성능 손실 없이 실행 시간에 즉시 켤 수 있도록 합니다). 5개의 로그 중 하나라도 ERROR 수준 이상(예: ERROR, INFO 또는 DEBUG)으로 설정되면 log4jdbc가 활성화되어 기본 드라이버에서 반환된 JDBC 연결에서 활동을 래핑 및 로깅합니다.
로그 설명
jdbc.sqlonly | SQL만 기록합니다. prepared statement 내에서 실행된 SQL은 가독성을 크게 높이기 위해 해당 위치에서 바인딩된 데이터와 대체된 바인드 인수를 함께 자동으로 표시됩니다. |
jdbc.sqltiming | SQL을 실행하는 데 걸린 시간에 대한 타이밍 통계를 포함하여 실행 후 SQL을 기록합니다. |
jdbc.audit | ResultSets를 제외한 모든 JDBC 호출을 기록합니다. 이것은 매우 방대한 출력이며 특정 JDBC 문제를 추적하지 않는 한 일반적으로 필요하지 않습니다. |
jdbc.resultset | ResultSet 개체에 대한 모든 호출이 기록되기 때문에 훨씬 더 방대합니다. |
jdbc.resultsettable | jdbc 결과를 테이블로 기록합니다. 디버그 레벨에서는 result sets 에서 읽지 않은 값도 채웁니다. |
jdbc.connection | connenction open 및 close 이벤트를 기록하고 열려 있는 모든 connection 번호를 덤프합니다. 이는 연결 누수 문제를 추적하는 데 매우 유용합니다. |
4.3 Log4j 2 또는 SLF4J 모두 사용
사용되는 수준은 표준 구현과 동일합니다.
- DEBUG에는 SQL이 실행된 클래스 이름과 라인 번호(사용 가능한 경우)가 포함됩니다. DEBUG 수준은 사용할 때 추가적인 성능 저하를 초래하므로 각별히 주의하여 사용하십시오.
- INFO에는 SQL(또는 적용 가능한 기타 정보)이 포함됩니다.
- ERROR에는 SQLExceptions 가 발생할 때 로그 출력에 스택 추적이 포함됩니다(활성화된 경우 느린 쿼리, 아래 참조).
또한 log4jdbc의 내부 디버깅과 함께 사용하기 위한 log4jdbc.debug라는 로거가 하나 있습니다. 이때 log4jdbc spy 드라이버가 로드될 때 어떤 기본 드라이버가 발견되었고 발견되지 않았는지에 대한 정보만 출력합니다.
Log4j 2와 함께 사용
이 예제에서는 클래스 경로에 있는 log4j2.xml 구성 파일을 통해 Log4j 2를 구성한다고 가정합니다.
1. ERROR 레벨의 기본 구성
Log4j 2 구성 파일의 예: log4jdbc.log4j2 로거를 사용하고 log4jdbc.out 파일에 오류(및 활성화된 경우 느린 쿼리, 아래 참조)를 기록합니다.
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="OFF">
<appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %level - %m%n%ex%n"/>
</Console>
<File name="log4jdbc_file" fileName="log4jdbc.out">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %level - %m%n%ex%n"/>
</File>
</appenders>
<loggers>
<root level="off">
<appender-ref ref="Console"/>
</root>
<logger name="log4jdbc.log4j2" level="error" additivity="false">
<appender-ref ref="log4jdbc_file"/>
</logger>
</loggers>
</configuration>
2. INFO 또는 DEBUG 수준에서 권장된 구성
이 수정된 구현은 표준 구현에서 다른 로거들을 사용 하는 것이 아닌 Markers 를 사용합니다. 다음은 모든 관련 정보(SQL statements, Connection calls, Exceptions thrown)를 기록하고 JDBC 호출이나 result sets 을 테이블로 기록하지 않는 INFO 또는 DEBUG 수준의 구성 예입니다.
<logger name="log4jdbc.log4j2" level="info" additivity="false">
<MarkerFilter marker="LOG4JDBC_OTHER" onMatch="DENY" onMismatch="NEUTRAL"/>
<appender-ref ref="log4jdbc_file"/>
</logger>
3. result sets 을 테이블로 로깅할 때 INFO 또는 DEBUG 레벨에서 권장된 구성(log4jdbc-remix 기능)
이 구성은 모든 관련 정보(SQL statements, Connection calls, Exceptions thrown)와 result sets 을 테이블(log4jdbc-remix 기능)로 기록합니다.
<logger name="log4jdbc.log4j2" level="info" additivity="false">
<MarkerFilter marker="LOG4JDBC_JDBC" onMatch="DENY" onMismatch="NEUTRAL"/>
<appender-ref ref="log4jdbc_file"/>
</logger>
4. 표준 log4jdbc 및 log4jdbc-remix 동작 재현
Log4jdbc 및 log4jdbc-remix는 6개의 로거를 사용하여 다양한 정보를 기록합니다(log4jdbc 설명서 참조). 이 수정된 구현은 마커를 사용하여 동일한 작업을 수행합니다. 다음은 log4jdbc 및 log4jdbc-remix 로거 동작을 재현하기 위한 구성입니다.
- jdbc.sqltiming: 실행 시간과 함께 SQL 문을 기록하고 connection calls 나 JDBC 및 ResultSet 호출을 기록하지 않습니다.
<logger name="log4jdbc.log4j2" level="info" additivity="false">
<MarkerFilter marker="LOG4JDBC_NON_STATEMENT" onMatch="DENY" onMismatch="NEUTRAL"/>
<appender-ref ref="log4jdbc_file"/>
</logger>
- jdbc.audit: ResultSets를 제외한 모든 JDBC 호출을 기록합니다.
<logger name="log4jdbc.log4j2" level="info" additivity="false">
<MarkerFilter marker="LOG4JDBC_AUDIT" onMatch="ACCEPT" onMismatch="DENY"/>
<appender-ref ref="log4jdbc_file"/>
</logger>
- jdbc.resultset: ResultSet 호출을 기록합니다.
<logger name="log4jdbc.log4j2" level="info" additivity="false">
<MarkerFilter marker="LOG4JDBC_RESULTSET" onMatch="ACCEPT" onMismatch="DENY"/>
<appender-ref ref="log4jdbc_file"/>
</logger>
- jdbc.connection: 연결 호출을 기록합니다.
<logger name="log4jdbc.log4j2" level="info" additivity="false">
<MarkerFilter marker="LOG4JDBC_CONNECTION" onMatch="ACCEPT" onMismatch="DENY"/>
<appender-ref ref="log4jdbc_file"/>
</logger>
- jdbc.resultsettable: jdbc 결과를 테이블로 기록합니다(log4jdbc-remix 기능). 디버그 레벨에서는 result sets 에서 읽지 않은 값도 채웁니다.
<logger name="log4jdbc.log4j2" level="info" additivity="false">
<MarkerFilter marker="LOG4JDBC_RESULTSETTABLE" onMatch="ACCEPT" onMismatch="DENY"/>
<appender-ref ref="log4jdbc_file"/>
</logger>
- jdbc.sqlonly: 이 로거의 동작이 구현되지 않았습니다. 이것은 하나의 로거를 유지하려는 의도를 위함 입니다. 이벤트를 즉시 기록하고 작업이 실행되기 전과 실행 시간을 알기 전에는 확실히 다른 로거 또는 완전히 다른 마커 시스템이 필요합니다. 또한 실행 시간은 항상 유용한 정보인 것 같습니다.
5. 일부 SQL 작업을 비활성화하거나 다른 파일로 dispatch
log4jdbc의 표준 구현은 log4jdbc 속성( log4jdbc.dump.sql.select , log4jdbc.dump.sql.insert , log4jdbc.dump.sql.update , log4jdbc.dumpsql.create , log4jdbc.dump.sql.delete)의 구성을 통해 일부 SQL 작업의 로깅을 비활성화할 수 있습니다.
동일한 기능이 Markers( LOG4JDBC_SELECT , LOG4JDBC_INSERT , LOG4JDBC_UPDATE , LOG4JDBC_CREATE , LOG4JDBC_DELETE )를 사용하여 구현됩니다. 이는 다른 파일에서 다른 작업을 dispatch할 수도 있다는 이점이 있습니다. log4jdbc 속성은 여전히 설정할 수 있으며 Marker 보다 우선합니다.
다음은 하나의 파일에서 update 작업을 dispatch 하는 동안 select 작업의 로깅을 비활성화하는 구성 파일의 예입니다.
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="OFF">
<appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %level - %m%n%ex%n"/>
</Console>
<File name="log4jdbc_update" fileName="log4jdbc_update.out">
<MarkerFilter marker="LOG4JDBC_UPDATE" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %level - %m%n%ex%n"/>
</File>
<File name="log4jdbc_file" fileName="log4jdbc.out">
<MarkerFilter marker="LOG4JDBC_UPDATE" onMatch="DENY" onMismatch="NEUTRAL"/>
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %level - %m%n%ex%n"/>
</File>
</appenders>
<loggers>
<root level="off">
<appender-ref ref="Console"/>
</root>
<logger name="log4jdbc.log4j2" level="info" additivity="false">
<MarkerFilter marker="LOG4JDBC_SELECT" onMatch="DENY" onMismatch="NEUTRAL"/>
<appender-ref ref="log4jdbc_file"/>
<appender-ref ref="log4jdbc_update"/>
</logger>
</loggers>
</configuration>
유사한 방식으로 SQLException s는 Marker LOG4JDBC_EXCEPTION을 사용하여 별도의 파일로 보낼 수 있습니다(이는 ERROR 수준의 느린 쿼리를 로깅하는 기능이 활성화될 때 유용합니다. 이 경우 오류가 항상 예외와 연결되는 것은 아닙니다. )
DataSource 구성
option 1: 드라이버 클래스 이름 및 JDBC URL 구성
log4jdbc-log4j2 드라이버( net.sf.log4jdbc.sql.jdbcapi.DriverSpy )를 사용하거나 수정된 JDBC URL( 일반 JDBC URL 앞에 jdbc:log4 추가)을 사용 하도록 DataSource를 구성할 수 있습니다 .
option 2: log4jdbc DataSource 로 래핑
자신의 DataSource를 log4jdbc-log4j2 DataSource로 래핑할 수 있습니다. 예를 들어 다음과 같은 경우:
<bean id="dataSource" class="...">
<property name="driverClass" value="${datasource.driverClassName}"/>
<property name="jdbcUrl" value="${datasource.url}"/>
<property name="user" value="${datasource.username}"/>
<property name="password" value="${datasource.password}"/>
...
</bean>
다음으로 변경
<bean id="dataSourceSpied" class="...">
<property name="driverClass" value="${datasource.driverClassName}"/>
<property name="jdbcUrl" value="${datasource.url}"/>
<property name="user" value="${datasource.username}"/>
<property name="password" value="${datasource.password}"/>
...
</bean>
<bean id="dataSource" class="net.sf.log4jdbc.sql.jdbcapi.DataSourceSpy">
<constructor-arg ref="dataSourceSpied" />
</bean>
사용자 정의 SQL formatter
log4jdbc-remix와 마찬가지로 사용자 지정 로그 포맷터를 제공할 수 있습니다. 로거는 net.sf.log4jdbc.log.SpyLogDelegator 인터페이스를 구현해야 합니다. log4jdbc-log4j2를 사용하려면 다른 옵션이 있습니다.
- 옵션 1 (권장 방법): log4jdbc.spylogdelegator.name 옵션을 설정하여 SpyLogDelegator 구현의 정규화된 클래스 이름을 제공합니다. log4jdbc 옵션 설정에 대한 자세한 내용은 아래를 참조하십시오.
- 옵션 2 : 응용 프로그램에서 net.sf.log4jdbc.log.SpyLogFactory.setSpyLogDelegator(SpyLogDelegator) 메서드를 사용합니다. 이 메서드는 log4jdbc-log4j2 드라이버를 로드하기 전에 호출해야 하므로 DriverManager 또는 DataSource를 호출하기 전에 호출해야 합니다.
- 옵션 3 : 애플리케이션 또는 bean 선언에서 net.sf.log4jdbc.sql.jdbcapi.DataSourceSpy.setLogDelegator(SpyLogDelegator) 메소드 사용. 이 방법을 사용하면 데이터 소스마다 다른 로그 포맷터를 사용할 수 있습니다. Log4j 2용 기본 SpyLogDelegator를 사용하거나(Log4j 2 설치 외에 필요한 조치 없음) 기본 로그 포맷터(log4jdbc 초기화에 사용됨)를 제공해야 합니다. SLF4J 또는 사용자 지정 로거.
log4jdbc-log4j2 옵션 구성
log4jdbc-log4j2는 log4jdbc와 똑같은 방식으로 구성할 수 있습니다(아래 참조). log4jdbc와 비교할 때 두 가지 변경 사항에 유의하십시오.
- log4jdbc.spylogdelegator.name: 사용할 로거의 정규화된 클래스 이름을 제공할 수 있는 새로운 옵션입니다. 특히 Log4j 2가 아닌 SLF4J 로거를 사용하려면 이 옵션을 net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator 값으로 설정해야 합니다 .
- log4jdbc.debug.stack.prefix: 이 속성은 이제 스택 추적의 패키지 접두사가 아닌 REGEX입니다. 따라서 예를 들어 접두사 org.mypackage를 대상으로 지정하려는 경우 이 속성의 값은 ^org\.mypackage.*여야 합니다.
구성 파일 또는 시스템 속성
log4jdbc 설명서에서: 클래스 경로에 저장된 log4jdbc.log4j2.properties 라는 파일에서 또는 시스템 속성을 통해 모든 log4jdbc 설정을 정의할 수 있습니다 . log4jdbc는 구성 파일(있는 경우)과 시스템 속성 모두에서 속성을 찾습니다. 파일은 두 위치에 정의된 모든 속성에 우선합니다.
예를 들어 log4jdbc.spylogdelegator.name 옵션을 설정하려는 경우 다음 중 하나를 수행할 수 있습니다. log4jdbc.log4j2.properties 파일에 추가:
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
또는 시스템 속성을 사용합니다.
java -Dlog4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator -classpath ./classes my.funky.Program
log4jdbc-log4j2 옵션
log4jdbc.drivers | log4jdbc가 로드하고 래핑해야 하는 JDBC 드라이버에 대한 하나 이상의 정규화된 클래스 이름입니다. 여기에서 둘 이상의 드라이버를 지정해야 하는 경우 공백 없이 쉼표로 구분해야 합니다. 대부분의 인기 있는 JDBC 드라이버가 기본적으로 이미 로드되어 있기 때문에 이 옵션은 일반적으로 필요하지 않습니다. log4jdbc가 아직 래핑하지 않은 하나 이상의 추가 JDBC 드라이버를 포함해야 하는 경우 이 옵션을 사용해야 합니다. | |
log4jdbc.auto.load.popular.drivers | true | 자주 사용되는 드라이버가 자동으로 로드되는 기능을 비활성화하려면 이를 false로 설정하십시오. 이것이 거짓이면 원하는 드라이버를 로드하기 위해 log4jdbc.drivers 속성을 설정해야 합니다. |
log4jdbc.debug.stack.prefix | 애플리케이션의 패키지 이름과 일치하는 REGEX입니다. 호출 스택은 일치하는 REGEX가 있는 클래스의 첫 번째 항목까지 검색됩니다. 이것이 설정되지 않은 경우 log4jdbc로 호출된 실제 클래스가 디버그 출력에서 사용됩니다(대부분의 경우 이것은 연결 풀 클래스입니다.) 예를 들어 다음과 같은 시스템 속성 설정: -Dlog4jdbc.debug.stack. prefix=^com\.mycompany\.myapp.*는 호출 스택이 com.mycompany.myapp 패키지 이하의 코드에서 오는 첫 번째 호출을 검색하게 하므로 모든 SQL 생성 코드가 코드에 있는 경우 com.mycompany.myapp 패키지 또는 하위 패키지에 있는 경우 연결 풀, 객체 관계형 시스템 등에 대한 패키지 이름이 아닌 디버그 정보에 인쇄됩니다. 이 속성의 동작은 표준 log4jdbc 구현과 비교하여 변경되었습니다 . 이 속성은 이제 스택 추적의 패키지 접두사가 아닌 REGEX입니다. 따라서 예를 들어 접두사 org.mypackage를 대상으로 지정하려는 경우 이 속성의 값은 ^org\.mypackage.*여야 합니다. |
|
log4jdbc.sqltiming.warn.threshold | 밀리초 시간 값. 지정된 시간(밀리초) 또는 실행하는 데 더 많은 시간이 걸리는 SQL이 sqltiming 로그에 경고 수준으로 기록되도록 합니다. 이 기능이 작동하려면 경고 로그 수준에서 sqltiming 로그를 활성화해야 합니다. 또한 이 설정에 대해 기록된 출력은 일반적으로 sqltiming 로그가 디버그 수준에서 활성화된 경우에만 표시되는 디버그 정보와 함께 기록됩니다. 이렇게 하면 임계값 수준 아래에서 실행되는 정상 실행 SQL에 대한 오버헤드나 로깅을 추가하지 않고도 느리게 실행되는 SQL을 더 빨리 찾을 수 있습니다(로깅 수준이 적절하게 설정된 경우). | |
log4jdbc.sqltiming.error.threshold | 밀리초 시간 값. 지정된 시간(밀리초) 또는 실행하는 데 더 많은 시간이 걸리는 SQL이 sqltiming 로그의 오류 수준에 기록되도록 합니다. 이 기능이 작동하려면 오류 로그 수준에서 sqltiming 로그를 활성화해야 합니다. 또한 이 설정에 대해 기록된 출력은 일반적으로 sqltiming 로그가 디버그 수준에서 활성화된 경우에만 표시되는 디버그 정보와 함께 기록됩니다. 이렇게 하면 임계값 수준 아래에서 실행되는 정상 실행 SQL에 대한 오버헤드나 로깅을 추가하지 않고도 느리게 실행되는 SQL을 더 빨리 찾을 수 있습니다(로깅 수준이 적절하게 설정된 경우). | |
log4jdbc.dump.booleanastruefalse | false | SQL에서 부울 값을 덤프할 때 'true' 또는 'false'로 덤프하십시오. 이 옵션을 설정하지 않으면 부울 유형이 없는 데이터베이스가 많기 때문에 1 또는 0으로 덤프되며 이는 더 이식 가능한 SQL 덤프를 허용합니다. |
log4jdbc.dump.sql.maxlinelength | 90 | SQL을 덤프할 때 이 값이 0보다 크면 덤프된 SQL이 이 값보다 길지 않은 행으로 나뉩니다. log4jdbc가 이러한 방식으로 SQL을 줄로 나누지 않도록 하려면 이 값을 0으로 설정하십시오. 향후 log4jdbc 버전에서는 기본값이 0이 될 것입니다. |
log4jdbc.dump.fulldebugstacktrace | false | 디버그 모드에서 덤프하는 경우 전체 스택 추적을 덤프하십시오. 이렇게 하면 매우 방대한 출력이 생성되지만 생성된 SQL에 대한 호출 체인을 추적하려고 할 때 일부 상황에서 매우 유용할 수 있습니다. |
log4jdbc.dump.sql.select | true | 출력에서 SQL 선택 문을 억제하려면 이 값을 false로 설정합니다. Log4j 2 로거를 사용하는 경우 마커 LOG4JDBC_SELECT를 통해 선택 문 출력을 제어할 수도 있습니다(위의 "일부 SQL 작업 비활성화 또는 다른 파일에서 디스패치" 섹션 참조). 이 속성을 사용하면 마커를 사용할 수 있습니다. |
log4jdbc.dump.sql.insert | true | 출력에서 SQL 삽입 문을 억제하려면 이를 false로 설정하십시오. Log4j 2 로거를 사용하는 경우 마커 LOG4JDBC_INSERT를 통해 삽입 문 출력을 제어할 수도 있습니다(위의 "일부 SQL 작업 비활성화 또는 다른 파일에서 디스패치" 섹션 참조). 이 속성을 사용하면 마커를 사용할 수 있습니다. |
log4jdbc.dump.sql.update | true | 출력에서 SQL 업데이트 문을 억제하려면 이를 false로 설정하십시오. Log4j 2 로거를 사용하는 경우 마커 LOG4JDBC_UPDATE를 통해 업데이트 문 출력을 제어할 수도 있습니다(위의 "일부 SQL 작업 비활성화 또는 다른 파일에서 디스패치" 섹션 참조). 이 속성을 사용하면 마커를 사용할 수 있습니다. |
log4jdbc.dump.sql.delete | true | 출력에서 SQL 삭제 문을 억제하려면 이를 false로 설정하십시오. Log4j 2 로거를 사용하는 경우 마커 LOG4JDBC_DELETE를 통해 삭제 명령문 출력을 제어할 수도 있습니다(위의 "일부 SQL 작업 비활성화 또는 다른 파일에서 디스패치" 섹션 참조). 이 속성을 사용하면 마커를 사용할 수 있습니다. |
log4jdbc.dump.sql.create | true | 출력에서 SQL 작성 명령문을 억제하려면 이를 false로 설정하십시오. Log4j 2 로거를 사용하는 경우 마커 LOG4JDBC_CREATE를 통해 create 문 출력을 제어할 수도 있습니다(위의 "일부 SQL 작업 비활성화 또는 다른 파일에서 디스패치" 섹션 참조). 이 속성을 사용하면 마커를 사용할 수 있습니다. |
log4jdbc.dump.sql.add세미콜론 | false | 출력에서 SQL 끝에 여분의 세미콜론을 추가하려면 이를 true로 설정하십시오. 이것은 나중에 실행할 데이터베이스로 피드백할 스크립트를 만들기 위해 log4jdbc를 사용하여 프로그램에서 SQL을 생성하려는 경우에 유용할 수 있습니다. |
log4jdbc.spylogdelegator.name | net.sf.log4jdbc.log.log4j2.Log4j2SpyLogDelegator | 사용할 SpyLogDelegator의 정규화된 클래스 이름입니다. Log4j 2가 아닌 SLF4J와 함께 log4jdbc-log4j2를 사용하려면 이 속성을 net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator로 설정해야 합니다. 이것은 표준 log4jdbc 구현에 없는 새로운 속성입니다. |
log4jdbc.statement.warn | false | 명령문이 로그에서 사용될 때 로그에 경고(왜 신경쓰겠습니까?)를 표시하려면 이 항목을 true로 설정하십시오. 참고, 이것은 1.2alpha2 이전 릴리스에서 항상 참이었습니다. 릴리스 1.2 알파 2부터 기본적으로 false입니다. |
log4jdbc.trim.sql | true | 로깅된 SQL을 트리밍하지 않으려면 이를 false로 설정하십시오. (이전 버전은 항상 SQL을 트리밍했습니다.) |
log4jdbc.trim.sql.extrablanklines | true | 로깅된 SQL에서 여분의 빈 줄을 트리밍하지 않으려면 이를 false로 설정합니다(기본적으로 한 행에 둘 이상의 빈 줄이 발생하면 연속된 줄은 하나의 빈 줄로 축소됩니다.)(이전 버전에서는 추가 공백을 트리밍하지 않았습니다. 라인 전혀.) |
log4jdbc.suppress.generated.keys.exception | false | Statement.getGeneratedKeys() 메서드에서 생성된 모든 예외를 무시하려면 true로 설정합니다(Coldfusion과 함께 log4jdbc를 사용하는 데 유용함). |
추가 속성을 사용하면 속성 파일의 이름을 설정할 수 있습니다.
log4jdbc.log4j2.properties.file | log4jdbc.log4j2.properties | 사용할 속성 파일의 이름을 설정합니다 |
참고
https://log4jdbc.brunorozendo.com/
https://gist.github.com/livreprogramacao/8a727688dede9c7a156eb518aaea28ef
https://github.com/arthurblake/log4jdbc
https://logging.apache.org/log4j/2.x/manual/filters.html#MarkerFilter