snp-batch-validation/src/main/resources/logback-spring.xml
HeungTak Lee 6af2fccbf0 [신규 기능]
- aisTargetImportJob: S&P Global AIS API 연동 (매 분 15초)
- AIS Target 조회 API (MMSI/시간/공간/폴리곤/WKT 검색)
- 항해 조건 필터 검색 API (SOG/COG/Heading/Destination/Status)
- Caffeine 캐시 적용 (TTL 120분, 최대 30만건)
- partitionManagerJob: 매일 1회 일별,월별 파티션 자동 생성

[개선]
- API context-path: /snp-api로 변경 (다른 API 서비스의 Proxy 설정 충돌 방지)
- BaseApiReader 상태 초기화 로직 추가 (재실행 시 0건 버그 수정)
- logback-spring.xml: 로그 파일 분리 및 롤링 정책 적용
2025-12-02 16:24:57 +09:00

235 lines
9.6 KiB
XML

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds">
<!-- ========================================
프로퍼티 정의
======================================== -->
<property name="LOG_PATH" value="logs"/>
<property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{40} - %msg%n"/>
<property name="LOG_PATTERN_SIMPLE" value="%d{HH:mm:ss.SSS} %-5level %logger{20} - %msg%n"/>
<!-- 파일 크기 및 보관 설정 -->
<property name="MAX_FILE_SIZE" value="100MB"/>
<property name="MAX_HISTORY" value="30"/>
<property name="TOTAL_SIZE_CAP" value="10GB"/>
<!-- ========================================
콘솔 Appender (개발용)
======================================== -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${LOG_PATTERN_SIMPLE}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- ========================================
메인 로그 (application.log)
- 일반 애플리케이션 로그
- INFO 레벨 이상
======================================== -->
<appender name="APP_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/application.log</file>
<encoder>
<pattern>${LOG_PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/archive/application.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
<maxHistory>${MAX_HISTORY}</maxHistory>
<totalSizeCap>${TOTAL_SIZE_CAP}</totalSizeCap>
</rollingPolicy>
</appender>
<!-- ========================================
배치 로그 (batch.log)
- Spring Batch Job/Step 실행 이력
- Job 시작/종료, 처리 건수 등
======================================== -->
<appender name="BATCH_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/batch.log</file>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level [%X{jobName}] %logger{30} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/archive/batch.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
<maxHistory>${MAX_HISTORY}</maxHistory>
<totalSizeCap>${TOTAL_SIZE_CAP}</totalSizeCap>
</rollingPolicy>
</appender>
<!-- ========================================
API 요청 로그 (api-access.log)
- REST API 요청/응답 이력
- 요청 IP, 파라미터, 응답시간 등
======================================== -->
<appender name="API_ACCESS_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/api-access.log</file>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/archive/api-access.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
<maxHistory>${MAX_HISTORY}</maxHistory>
<totalSizeCap>${TOTAL_SIZE_CAP}</totalSizeCap>
</rollingPolicy>
</appender>
<!-- ========================================
메트릭 로그 (metrics.log)
- 성능 지표, 통계 정보
- 주기적 상태 체크 로그
======================================== -->
<appender name="METRICS_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/metrics.log</file>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/archive/metrics.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxFileSize>50MB</maxFileSize>
<maxHistory>7</maxHistory>
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
</appender>
<!-- ========================================
에러 로그 (error.log)
- ERROR, WARN 레벨만 기록
- 문제 추적용
======================================== -->
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/error.log</file>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>WARN</level>
</filter>
<encoder>
<pattern>${LOG_PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/archive/error.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
<maxHistory>60</maxHistory>
<totalSizeCap>5GB</totalSizeCap>
</rollingPolicy>
</appender>
<!-- ========================================
비동기 Appender (성능 최적화)
======================================== -->
<appender name="ASYNC_APP" class="ch.qos.logback.classic.AsyncAppender">
<queueSize>512</queueSize>
<discardingThreshold>0</discardingThreshold>
<appender-ref ref="APP_FILE"/>
</appender>
<appender name="ASYNC_BATCH" class="ch.qos.logback.classic.AsyncAppender">
<queueSize>256</queueSize>
<discardingThreshold>0</discardingThreshold>
<appender-ref ref="BATCH_FILE"/>
</appender>
<!-- ========================================
Logger 설정 - 패키지별 레벨
======================================== -->
<!-- 애플리케이션 로거 -->
<logger name="com.snp.batch" level="INFO" additivity="false">
<appender-ref ref="ASYNC_APP"/>
<appender-ref ref="ERROR_FILE"/>
<appender-ref ref="CONSOLE"/>
</logger>
<!-- 배치 Job/Config 로거 -->
<logger name="com.snp.batch.jobs" level="INFO" additivity="false">
<appender-ref ref="ASYNC_BATCH"/>
<appender-ref ref="ERROR_FILE"/>
<appender-ref ref="CONSOLE"/>
</logger>
<!-- 배치 Reader/Processor/Writer - 개별 row 로그 최소화 -->
<logger name="com.snp.batch.common.batch.reader" level="INFO" additivity="false">
<appender-ref ref="ASYNC_BATCH"/>
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="com.snp.batch.jobs.aistarget.batch.reader" level="INFO" additivity="false">
<appender-ref ref="ASYNC_BATCH"/>
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="com.snp.batch.jobs.aistarget.batch.processor" level="WARN" additivity="false">
<appender-ref ref="ASYNC_BATCH"/>
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="com.snp.batch.jobs.aistarget.batch.writer" level="INFO" additivity="false">
<appender-ref ref="ASYNC_BATCH"/>
<appender-ref ref="CONSOLE"/>
</logger>
<!-- API 요청 로거 -->
<logger name="com.snp.batch.api.logging" level="INFO" additivity="false">
<appender-ref ref="API_ACCESS_FILE"/>
</logger>
<!-- 메트릭 로거 -->
<logger name="com.snp.batch.metrics" level="INFO" additivity="false">
<appender-ref ref="METRICS_FILE"/>
</logger>
<!-- 파티션 관리 로거 -->
<logger name="com.snp.batch.global.partition" level="INFO" additivity="false">
<appender-ref ref="ASYNC_BATCH"/>
<appender-ref ref="CONSOLE"/>
</logger>
<!-- Spring Batch 프레임워크 - 핵심 로그만 -->
<logger name="org.springframework.batch" level="WARN" additivity="false">
<appender-ref ref="ASYNC_BATCH"/>
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="org.springframework.batch.core.job" level="INFO" additivity="false">
<appender-ref ref="ASYNC_BATCH"/>
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="org.springframework.batch.core.step" level="INFO" additivity="false">
<appender-ref ref="ASYNC_BATCH"/>
<appender-ref ref="CONSOLE"/>
</logger>
<!-- Spring 프레임워크 -->
<logger name="org.springframework" level="WARN"/>
<logger name="org.springframework.web" level="WARN"/>
<!-- Hibernate/JPA - SQL 로그 최소화 -->
<logger name="org.hibernate" level="WARN"/>
<logger name="org.hibernate.SQL" level="WARN"/>
<logger name="org.hibernate.type.descriptor.sql" level="WARN"/>
<!-- JDBC -->
<logger name="org.springframework.jdbc" level="WARN"/>
<logger name="com.zaxxer.hikari" level="WARN"/>
<!-- Quartz 스케줄러 -->
<logger name="org.quartz" level="WARN"/>
<!-- WebClient/Reactor -->
<logger name="reactor.netty" level="WARN"/>
<logger name="io.netty" level="WARN"/>
<!-- ========================================
Root Logger
======================================== -->
<root level="INFO">
<appender-ref ref="ASYNC_APP"/>
<appender-ref ref="ERROR_FILE"/>
<appender-ref ref="CONSOLE"/>
</root>
</configuration>