이 글은 확실한 자료가 아니고 그냥 검색 기록이다.
쉽게 말하자면 logback은 log4j의 업그레이드 버전이다.
스프링부트에는 기본적으로 라이브러리가 탑재되어서 간편하게 쓸 수 있다. 나는 생짜배기 jar로 넣어야하기 때문에 열심히 조사하
🔩logback 라이브러리
(보안위험 log4j 버전 주의!!!!!!!!!)
👀 logback 사용
logback-classic (logback-core, SLF4J API 라이브러리 포함)
👀 log4j로 쿼리 정렬 및 파라미터 대입
log4jdbc-log4j2-jdbc4.1-1.16.jar
라이브러리 뭐가 이리 많은지 어질어질하다. 글마다 필수 라이브러리 목록도 다르고,,
commons-logging-1.2.jar
logback-classic-1.2.3.jar
logback-core-1.2.3.jar
log4jdbc-log4j2-jdbc4.1-1.16.jar
log4j-1.2.17.jar
slf4j-api-1.6.6.jar
jcl-over-slf4j-1.7.6.jar
gradle, maven, jar 파일이든 아래 사이트에 들어가서 다운로드 가능하다.
내가 본 설정 파일들은 이렇다.
- logback.xml
- log4jdbc.log4j2.properties
- context-datasource.xml
- jdbcs.properties
🔩 logback.xml
경로 src\main\resources
- property
- appender (encoder, pattern)
- ch.qos.logback.core.ConsoleAppender : 콘솔에 쌓기
- ch.qos.logback.classic.db.DBAppender : DB에 쌓기
- https://logback.qos.ch/manual/appenders.html
- logger ( TRACE, DEBUG, INFO, WARN, ERROR)
- root
🔩 log4jdbc.log4j2.properties
logback.xml과 같은 경로에 있어야 한다는데 내가 보는 프로젝트는 하위 log 패키지에 있다.
하위 패키지까지 다 찾는건지,, 경로 지정하는 곳을 못찾아서 확신이 없다.
log4jdbc.drivers=org.postgresql.Driver
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
log4jdbc.dump.sql.maxlinelength=0
🔩 context-datasource.xml
<bean id="datasource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<!-- logging을 위해 수정
<property name="driverClassName" value="org.postgresql.Driver" />
<property name="url" value="${jdbc.postgres.url}" />
-->
<property name="driverClassName" value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy" />
<property name="url" value="jdbc:log4jdbc:postgresql://URL:5432/postgres" />
<property name="username" value="${jdbc.postgres.username}"/>
<property name="password" value="${jdbc.postgres.password}"/>
<!--
<property name="defaultAutoCommit" value="false" />
<property name="initialSize" value="20"/>
<property name="maxActive" value="20"/>
<property name="maxIdle" value="20"/>
<property name="minIdle" value="20"/>
<property name="validationQuery" value="select 1" />
<property name="timeBetweenEvictionRunsMillis" value="150000" />
<property name="numTestsPerEvictionRun" value="2"/>
<property name="testWhileIdle" value="true" />
-->
</bean>
완벽히 해결되지 않은 것들
dbcp 2가지 종류를 쓰고 있는데 dbcp2를 쓰고 있는 쿼리만 정렬이 안되고 일렬로 나온다,..
처음엔 logback.xml이나 log4j2.properties에서 처음부터 끝까지 관장하고 있는줄 알았는데 그게 아닌듯 싶다. db 뽑은걸 가로채서 어쩌고하는 것 같은데,,더 잘봐야지
drivarClassName
postgresql이나 orcale 등 각 dbms 드라이버? net.sf.log4jdbc.sql.jdbcapi.DriverSpy?
* org.springframework.jdbc.datasource.DriverManagerDataSource
<bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" destroy-method="close">
</bean>
이걸로 바꿨다가 알아보니 이건 실제 커넥션 풀이 아니라고 한다..주의!
DriverManagerDataSource (Spring Framework 6.1.2 API)
Set the JDBC driver class name. This driver will get initialized on startup, registering itself with the JDK's DriverManager. NOTE: DriverManagerDataSource is primarily intended for accessing pre-registered JDBC drivers. If you need to register a new drive
docs.spring.io
🔩 jdbcs.properties
jdbc.postgres.url=jdbc:postgresql://URL:5432/DEV
jdbc.postgres.username=test
jdbc.postgres.password=test!
지금 프로젝트는 logback.xml을 로컬, 개발, 운영 별 분기해서 사용하고 있는데
운영거 조작하고는 안바뀌네,,이럼서 오만 생쇼를 다했다.
생각보다 간단한 문제였다.
이미지는 logger에 jdbc.resultsettable도 추가했고 로그가 너무 길어져서 나는 쿼리 정렬 + 파라미터 갈아끼우기로 만족.
근데 쿼리가 생각보다 덜 깔끔하게 정렬이 된다.. 왜일까? 파라미터 갈아끼우는거 없이 정렬만 되는 것도 찾아봐야지..
<logger name="jdbc.sqltiming" level="DEBUG"/>
👀 애플리케이션에서 직접 로깅하고 싶다면?
1. Lombok 라이브러리 추가 후 @Slf4j 어노테이션 사용
@Controller
@Slf4j
public class TestController {
@GetMapping("/")
public void test(String name){
log.info("test = {}", name);
}
}
2. LoggerFactory.getLogger 사용
private static final Logger logger = LoggerFactory.getLogger(testController.class);
@RequestMapping("/test.do")
public void test(String name) {
logger.info("test = {}", name);
}
net.sf.log4jdbc.sql.jdbcapi.DriverSpy와 org.postgresql.Driver는 서로 다른 JDBC 드라이버입니다. JDBC 드라이버는 특정 데이터베이스와의 연결을 지원하는 데 사용되며, 각각의 드라이버는 특정 데이터베이스 제품과의 상호 작용을 처리하는 역할을 합니다.
- net.sf.log4jdbc.sql.jdbcapi.DriverSpy:
- log4jdbc는 JDBC 드라이버를 래핑하여 SQL 쿼리를 로깅하고 분석하는 데 사용되는 라이브러리입니다.
- DriverSpy는 이 라이브러리에서 제공하는 JDBC 드라이버 중 하나로, 실제 데이터베이스 연결은 내부적으로 다른 JDBC 드라이버에 위임하면서 SQL 로깅을 추가로 수행합니다.
- 이 드라이버를 사용하면 애플리케이션에서 실행되는 모든 SQL 쿼리를 로그에 남길 수 있습니다.
- org.postgresql.Driver:
- PostgreSQL 데이터베이스에 연결하기 위한 JDBC 드라이버입니다.
- PostgreSQL 데이터베이스와 상호 작용할 때는 주로 이 드라이버를 사용합니다.
- org.postgresql.Driver를 사용하면 데이터베이스 연결 및 SQL 쿼리 수행이 기본적으로 이 드라이버에 의해 처리됩니다.
따라서 선택하는 드라이버에 따라 다음과 같은 차이가 있을 수 있습니다:
- net.sf.log4jdbc.sql.jdbcapi.DriverSpy를 사용하면 SQL 쿼리가 추가적으로 로깅되어 개발 및 디버깅에 도움이 될 수 있습니다. 하지만 성능에는 약간의 오버헤드가 발생할 수 있습니다.
- org.postgresql.Driver를 사용하면 PostgreSQL 데이터베이스와 직접 상호 작용할 수 있습니다. SQL 로깅은 추가로 수행되지 않습니다. 일반적으로 운영 환경에서는 이러한 SQL 로깅을 최소화하는 것이 권장됩니다.
어떤 드라이버를 선택할지는 프로젝트의 요구사항과 개발 및 디버깅 목적에 따라 다를 수 있습니다. 개발 환경에서는 net.sf.log4jdbc.sql.jdbcapi.DriverSpy를 사용하여 SQL 로깅을 편리하게 수행할 수 있으며, 운영 환경에서는 필요에 따라 선택할 수 있습니다.
'SPRING' 카테고리의 다른 글
검증은 어떻게 이루어질까. (@Valid, @Validated) (1) | 2024.01.09 |
---|---|
HTTP 메시지 컨버터, 요청 매핑 핸들러 어댑터 구조 (0) | 2023.08.22 |
SPRING Boot + JPA + React.js intellij 프로젝트 생성 (0) | 2023.03.31 |
property or field 'orderItems' cannot be found on object of type 오류 해결 (0) | 2023.03.12 |
DB 계정을 2개 이상 사용할 때 추가해줘야 하는 것 (0) | 2023.03.10 |