<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 기본 로그 경로 및 파일명 설정 (application.yml에서 설정되지 않은 경우 사용) -->
    <springProperty scope="context" name="LOG_PATH" source="logging.file.path" defaultValue="logs" />
    <springProperty scope="context" name="LOG_FILE" source="logging.file.name" defaultValue="application" />
    <springProperty scope="context" name="MAX_FILE_SIZE" source="logging.logback.rollingpolicy.max-file-size" defaultValue="10MB" />
    <springProperty scope="context" name="MAX_HISTORY" source="logging.logback.rollingpolicy.max-history" defaultValue="30" />
    <!-- 콘솔 출력 설정 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 컬러 콘솔 출력 설정 (개발 환경용) -->
    <appender name="CONSOLE_COLOR" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight(%-5level) [%thread] %cyan(%logger{36}) - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 파일 출력 설정 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_PATH}/${LOG_FILE}</file>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 일별 로그 파일 생성 -->
            <fileNamePattern>${LOG_PATH}/${LOG_FILE}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- 파일당 최고 용량 kb, mb, gb -->
                <maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!-- 30일 보관 -->
            <maxHistory>${MAX_HISTORY}</maxHistory>
            <cleanHistoryOnStart>true</cleanHistoryOnStart> <!-- 로그 파일 정리 기능을 활성화하여 서버 시작 시 로그 파일을 정리함, 실서버에서는 굳이 필요할까 함 -->
            <!-- 전체 로그 파일의 최대 크기 (예: 3GB) -->
            <totalSizeCap>3GB</totalSizeCap>
        </rollingPolicy>
        <!-- 디렉토리가 없으면 생성 -->
        <prudent>true</prudent>
    </appender>

    <!-- 비동기 파일 출력 설정 (성능 향상) -->
    <appender name="ASYNC_FILE" class="ch.qos.logback.classic.AsyncAppender">
        <appender-ref ref="FILE" />
        <queueSize>512</queueSize>
        <discardingThreshold>0</discardingThreshold>
        <includeCallerData>false</includeCallerData>
        <neverBlock>false</neverBlock>
    </appender>

    <!-- 로컬 환경에서만 적용되는 설정 -->
    <springProfile name="local">
        <!-- 로컬 환경에서는 컬러 콘솔 사용 -->
        <root level="INFO">
            <appender-ref ref="CONSOLE_COLOR" />
            <appender-ref ref="ASYNC_FILE" />
        </root>
    </springProfile>

    <!-- 개발 환경에서만 적용되는 설정 -->
    <springProfile name="dev">
        <!-- 개발 환경에서는 컬러 콘솔 사용 -->
        <root level="INFO">
            <appender-ref ref="CONSOLE_COLOR" />
            <appender-ref ref="ASYNC_FILE" />
        </root>
    </springProfile>

    <!-- 운영 환경에서만 적용되는 설정 -->
    <springProfile name="prd">
        <!-- 운영 환경에서는 일반 콘솔 사용 -->
        <root level="WARN">
            <appender-ref ref="CONSOLE" />
            <appender-ref ref="ASYNC_FILE" />
        </root>
    </springProfile>

</configuration>
