250x250
반응형
arkhyeon
arkhyeon
arkhyeon
전체 방문자
오늘
어제
  • 분류 전체보기 (88)
    • Spring (5)
    • Java (4)
    • React (25)
      • TypeScript (6)
      • JavaScript (1)
      • Jest (9)
    • NEXT (8)
    • SQL (1)
    • React native (1)
    • CSS (3)
    • Web (1)
    • Git (3)
    • ETC (6)
    • 빅데이터DB (8)
    • Docker (4)
    • Tool (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • kudu
  • jest
  • docker tomcat
  • react typescript
  • usetransition
  • websocket
  • react spring websocket
  • HIVE
  • javasciprt websocket
  • react loading
  • react19
  • WSS
  • react usetransition
  • javascript wss
  • websocket server
  • react websocket
  • react
  • node WebSocket
  • react jest
  • Spring WebSocket

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
arkhyeon

arkhyeon

Java

로그 쿼리 확인(log4j/logback)

2022. 12. 27. 15:48
728x90
반응형

1. Logback

현재 프로젝트 기준 logback.xml의 root의 level을 debug로 변경하면 로그 확인 가능

(...생략) ==>  Preparing: select * , (select wname from scs_wlist where wid = A.wid) , (select task_name from scs_taskinfo where tid = A.tid) as task_name , (select server_name from scs_server where serverid = A.serverid_src) as server_name_src , (select server_name from scs_server where serverid = A.serverid_dst) as server_name_dst from (select * from scs_tasklog order by end_dt desc) A join scs_taskinfo B on B.tid = A.tid where 1=1 and A.task_kind = ? AND (select wname from scs_wlist where wid = A.wid) LIKE ?||'%' AND (select task_name from scs_taskinfo where tid = A.tid) LIKE ?||'%' AND (select server_name from scs_server where serverid = A.serverid_src) LIKE ?||'%' AND (select server_name from scs_server where serverid = A.serverid_dst) LIKE ?||'%' AND A.start_dt >= ?::timestamp AND (A.end_dt <= ?::timestamp OR A.end_dt is null) ORDER by END_Dt desc limit ? offset ((? - 1) * ?) 
(...생략) ==> Parameters: 1(Integer), (String), (String), (String), (String), 2022-11-20 00:00:00(String), 2022-12-20 23:59:59(String), 20(Integer), 1(Integer), 20(Integer)
(...생략) <==      Total: 20

위와 같이 한 줄에 모든 쿼리가 작성되며 logger에 따라 다른 level이 사용되지 않아 Log4j를 사용

2. Log4j 설정

2.1. pom.xml dependency 추가

<dependency>
	<groupId>org.apache.logging.log4j</groupId>
	<artifactId>log4j-api</artifactId>
	<version>2.17.1</version>
</dependency>
<dependency>
	<groupId>org.bgee.log4jdbc-log4j2</groupId>
	<artifactId>log4jdbc-log4j2-jdbc4</artifactId>
	<version>1.16</version>
</dependency>

2.2 log4jdbc.log4j2.properties 생성

logback.xml 자리에 해당 파일 생성

현 프로젝트 기준 Project > resource

log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
//로그의 개행 처
log4jdbc.dump.sql.maxlinelength=0

3. logback.xml 수정

로그가 어떻게 콘솔, 파일에 찍힐 지 설정

<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
	<layout>
		<pattern> [%d{yyyy-MM-dd HH:mm:ss}] [%-5level] [%file; %method:%line] - %msg%n
		</pattern>
	</layout>
</appender>
	
<appender name="FILE-THREAD" class="ch.qos.logback.classic.sift.SiftingAppender">
	<discriminator>
		<key>logFileName</key>
		<defaultValue>NAME</defaultValue>
	</discriminator>
	<sift>
		<!-- A standard RollingFileAppender, the log file is based on 'logFileName' at runtime  -->
		<appender name="FILE-${logFileName}" class="ch.qos.logback.core.rolling.RollingFileAppender">
			<file>${LOG_HOME}/${logFileName}.log</file>
			<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
				<Pattern>[%d{yyyy-MM-dd HH:mm:ss}] [%-5level] %file; %method:%line - %msg%n</Pattern>
			</encoder>
			<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
				<FileNamePattern>${LOG_HOME}/${logFileName}.%i.log.zip</FileNamePattern>
				<MinIndex>1</MinIndex>
				<MaxIndex>10</MaxIndex>
			</rollingPolicy>
			<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
				<MaxFileSize>10MB</MaxFileSize>
			</triggeringPolicy>
	  	</appender>
	</sift>
</appender>

<logger name="jdbc" level="off"/>
<logger name="jdbc.sqlonly" level="off" />
<logger name="jdbc.sqltiming" level="info" additivity="false">
	<appender-ref ref="console"/>
	<appender-ref ref="FILE-THREAD"/>
</logger>
<logger name="jdbc.audit" level="off" />
<logger name="jdbc.resultset" level="off" />
<logger name="jdbc.resultsettable" level="off" />
<logger name="jdbc.connection" level="off" />

3.1 logger name 및 level

Logger Desc

jdbc.sqlonly SQL문만을 로그로 남기며, PreparedStatement일 경우 관련된 argument 값으로 대체된 SQL문 확인 가능
jdbc.sqltiming SQL문과 실행 시간 정보(milliseconds) 포함
jdbc.audit ResultSet을 제외 모든 JDBC 호출 정보 확인 (많은 로그가 생성 되므로 필요시 사용)
jdbc.resultset ResultSet을 포함 모든 JDBC 호출 정보 확인 (많은 로그가 생성 되므로 필요시 사용)
jdbc.resultsettable 조회된 데이터를 테이블 형태로 로그 확인

Level Desc

degug 디버그 용도로 일반 정보도 상세하게 출력
info 상태 변경과 같이 일반적인 정보를 출력
wran 경고성 메시지 (처리가능한 문제 또는 향후 에러의 원인이 될 수 있는 경고성 메시지)
error 일반적인 에러로 처리가 반드시 필요
fatal 시스템적으로 아주 심각한 에러가 발생, 어플리케이션 작동 불가
all 모든 로깅
off 로깅 해

3.2 표현식

Level Desc

%d / %d{y:m:d} 이벤트 발생 날짜 출력 ( 프로그램의 실행속도 영향)
%level 로그 레벨
%file 프로그램 파일명
%method method 이름
%line 라인 수
%msg 로그 내용
%n 개행

자세한 표현식 - https://logback.qos.ch/manual/layouts.html

728x90
반응형

'Java' 카테고리의 다른 글

Java Thread (예제 newSingleThreadScheduledExecutor)  (0) 2022.06.15
Runnable JAR Export + Window Scheduler  (0) 2022.05.31
String, StringBuffer, StringBuilder  (0) 2022.05.26
    'Java' 카테고리의 다른 글
    • Java Thread (예제 newSingleThreadScheduledExecutor)
    • Runnable JAR Export + Window Scheduler
    • String, StringBuffer, StringBuilder
    arkhyeon
    arkhyeon

    티스토리툴바