<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 不包含base.xml，因为我们自定义所有appender -->
    <!-- <include resource="org/springframework/boot/logging/logback/base.xml" /> -->

    <springProperty scope="context" name="serviceName" source="spring.application.name" defaultValue="web-server"/>
    <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <destination>172.16.32.134:5044</destination>
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
            <customFields>{"service":"${serviceName}"}</customFields>
            <includeContext>false</includeContext>
        </encoder>
    </appender>

    <springProperty name="application_name" scope="context" source="spring.application.name"/>
    <springProperty scope="context" name="LOG_HOME" source="logging.path"
                    defaultValue="serverlog"/>

    <!-- 日志级别 -->
    <springProperty scope="context" name="LOG_ROOT_LEVEL" source="logging.level.root" defaultValue="INFO"/>

    <!-- 日志文件名称-->
    <property name="LOG_PREFIX" value="spring-boot-logback"/>

    <!-- 日志文件编码-->
    <property name="LOG_CHARSET" value="UTF-8"/>

    <!-- 日志文件路径+日期-->
    <property name="LOG_DIR" value="${LOG_HOME}/%d{yyyy-MM-dd}"/>

    <!--对日志进行格式化-->
    <property name="LOG_MSG" value="- [%d{yyyy-MM-dd HH:mm:ss.SSS}] [%level] [%thread] [%logger{16}] --> %msg%n "/>

    <!--文件大小，默认10MB-->
    <property name="MAX_FILE_SIZE" value="30MB"/>

    <!-- 配置日志的滚动时间 ，value表示保留日志的天数，0表示永久保存 -->
    <property name="MAX_HISTORY" value="0"/>

    <!-- 彩色日志 -->
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
    <conversionRule conversionWord="wex"
                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
    <conversionRule conversionWord="wEx"
                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
    <!-- 彩色日志格式 -->
    <property name="CONSOLE_LOG_PATTERN"
              value="-[%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){blue}] [%clr(%level)] [%clr(%thread)] [%clr(%logger{16}){cyan}] %clr(-->){red} %clr(%msg%n){yellow}"/>

    <!--输出到控制台-->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
        </layout>
    </appender>

    <!--输出到文件-->
    <appender name="FILE_ALL" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--日志文件路径，日志文件名称-->
        <File>${LOG_HOME}/all_${LOG_PREFIX}.log</File>

        <!-- 使用 SizeAndTimeBasedRollingPolicy 替代 TimeBasedRollingPolicy -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--日志文件路径，新的 ALL 日志文件名称，使用 %i 作为索引 -->
            <FileNamePattern>${LOG_DIR}/all_${LOG_PREFIX}.%i.log</FileNamePattern>
            <!-- 保留日志的历史天数 -->
            <MaxHistory>${MAX_HISTORY}</MaxHistory>
            <!-- 单个日志文件的最大大小 -->
            <maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
        </rollingPolicy>

        <!-- 输出的日志内容格式化-->
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>${LOG_MSG}</pattern>
        </layout>
    </appender>

    <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <OnMismatch>DENY</OnMismatch>
            <OnMatch>ACCEPT</OnMatch>
        </filter>
        <!--日志文件路径，日志文件名称-->
        <File>${LOG_HOME}/err_${LOG_PREFIX}.log</File>

        <!-- 使用 SizeAndTimeBasedRollingPolicy 替代 TimeBasedRollingPolicy -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--日志文件路径，新的 ERR 日志文件名称，使用 %i 作为索引 -->
            <FileNamePattern>${LOG_DIR}/err_${LOG_PREFIX}.%i.log</FileNamePattern>
            <!-- 保留日志的历史天数 -->
            <MaxHistory>${MAX_HISTORY}</MaxHistory>
            <!-- 单个日志文件的最大大小 -->
            <maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
        </rollingPolicy>

        <!-- 输出的日志内容格式化-->
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>${LOG_MSG}</Pattern>
        </layout>
    </appender>

    <logger name="org.springframework" level="ERROR"/>
    <logger name="org.apache.commons" level="ERROR"/>

    <root level="${LOG_ROOT_LEVEL}">
        <!-- 控制台输出 -->
        <appender-ref ref="STDOUT"/>
        <!-- 本地文件输出 -->
        <appender-ref ref="FILE_ALL"/>
        <appender-ref ref="FILE_ERROR"/>
        <!-- Logstash输出 -->
        <appender-ref ref="LOGSTASH"/>
    </root>
</configuration>