<?xml version="1.0" encoding="UTF-8"?>
<!--
  Production Logback configuration for CBQ Logger with JSON output.
  
  Optimized for:
  - Splunk, ELK, Datadog, or any JSON log aggregator
  - High-throughput applications
  - Minimal overhead with async logging
  
  Usage:
  1. Copy this file to src/main/resources/logback-spring.xml
  2. Or include it: <include resource="logback-cbq-production.xml"/>
-->
<configuration scan="true" scanPeriod="30 seconds">
    
    <!-- Properties from environment or defaults -->
    <property name="LOG_LEVEL" value="${LOG_LEVEL:-INFO}" />
    <property name="LOG_PATH" value="${LOG_PATH:-/var/log/app}" />
    <property name="APP_NAME" value="${APP_NAME:-application}" />
    <property name="ENVIRONMENT" value="${ENVIRONMENT:-production}" />
    
    <!-- Console JSON appender (for container stdout) -->
    <appender name="CONSOLE_JSON" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="qa.cbq.kong.logging.encoder.NotusJsonEncoder">
            <prettyPrint>false</prettyPrint>
            <includeContext>true</includeContext>
            <includeMdc>true</includeMdc>
            <includeCallerData>false</includeCallerData>
            <maskSensitiveFields>true</maskSensitiveFields>
        </encoder>
    </appender>
    
    <!-- Rolling file appender with JSON -->
    <appender name="FILE_JSON" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_PATH}/${APP_NAME}.json</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/${APP_NAME}.%d{yyyy-MM-dd}.%i.json.gz</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>7</maxHistory>
            <totalSizeCap>1GB</totalSizeCap>
        </rollingPolicy>
        <encoder class="qa.cbq.kong.logging.encoder.NotusJsonEncoder">
            <prettyPrint>false</prettyPrint>
            <includeContext>true</includeContext>
            <includeMdc>true</includeMdc>
            <maskSensitiveFields>true</maskSensitiveFields>
        </encoder>
    </appender>
    
    <!-- Async appender for non-blocking logging -->
    <appender name="ASYNC_CONSOLE" class="ch.qos.logback.classic.AsyncAppender">
        <queueSize>2048</queueSize>
        <discardingThreshold>0</discardingThreshold>
        <neverBlock>true</neverBlock>
        <includeCallerData>false</includeCallerData>
        <appender-ref ref="CONSOLE_JSON" />
    </appender>
    
    <appender name="ASYNC_FILE" class="ch.qos.logback.classic.AsyncAppender">
        <queueSize>2048</queueSize>
        <discardingThreshold>0</discardingThreshold>
        <neverBlock>false</neverBlock>
        <includeCallerData>false</includeCallerData>
        <appender-ref ref="FILE_JSON" />
    </appender>
    
    <!-- Filter for CBQ logging -->
    <turboFilter class="filter.io.github.boreas4j.log.CBQLoggingFilter">
        <minLevel>INFO</minLevel>
    </turboFilter>
    
    <!-- Quiet noisy libraries -->
    <logger name="org.hibernate" level="WARN" />
    <logger name="org.springframework" level="WARN" />
    <logger name="org.apache" level="WARN" />
    <logger name="com.zaxxer.hikari" level="WARN" />
    <logger name="io.netty" level="WARN" />
    <logger name="io.lettuce" level="WARN" />
    <logger name="reactor.netty" level="WARN" />
    
    <!-- Application loggers -->
    <logger name="com.cbq" level="${LOG_LEVEL}" />
    
    <!-- Root logger -->
    <root level="${LOG_LEVEL}">
        <appender-ref ref="ASYNC_CONSOLE" />
        <appender-ref ref="ASYNC_FILE" />
    </root>
    
</configuration>
