<?xml version="1.0" encoding="UTF-8" ?>
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL，如果设置为WARN，则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时，配置文件如果发生改变，将会被重新加载，默认值为true -->
<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔，如果没有给出时间单位，默认单位是毫秒。当scan为true时，此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时，将打印出logback内部日志信息，实时查看logback运行状态。默认值为false。 -->
<configuration debug="false" scan="true" scanPeriod="10 seconds">
    <!-- 日志级别 -->
    <springProperty scope="context" name="LOG_ROOT_LEVEL" source="logging.level.root" defaultValue="INFO"/>
    <!-- 标识这个"STDOUT" 将会添加到这个logger -->
    <springProperty scope="context" name="STDOUT" source="log.stdout" defaultValue="STDOUT"/>

    <!-- 项目名称 -->
    <property name="PROJECT_NAME" value="ema_project-admin"/>
    <!-- 日志格式，%d：日期；%thread：线程名；%-5level：日志级别从左显示5个字符长度，列如:DEBUG； %logger{50}：java类名，例如:com.muses.taoshop.MyTest，50表示字符长度；%msg：日志内容；%d：换行 -->
    <property name="LOG_PATTERN" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n"/>
    <!-- 日志跟目录 -->
    <property name="LOG_HOME" value="./logs/${PROJECT_NAME}"/>
    <!-- 日志文件路径 -->
    <property name="LOG_DIR" value="${LOG_HOME}/%d{yyyyMMdd}"/>
    <!-- 日志文件名称 -->
    <property name="LOG_PREFIX" value="${PROJECT_NAME}"/>
    <!-- 日志文件编码 -->
    <property name="LOG_CHARSET" value="UTF-8"/>
    <!-- 配置日志的滚动时间，保存时间为15天 -->
    <property name="MAX_HISTORY" value="15"/>
    <!-- 文件大小，默认为10MB -->
    <property name="MAX_FILE_SIZE" value="30 MB"/>

    <!-- 打印到控制台 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!--此日志appender是为开发使用，只配置最底级别，控制台输出的日志级别是大于或等于此级别的日志信息-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>${LOG_ROOT_LEVEL}</level>
        </filter>
        <!-- 格式化日志内容 -->
        <encoder>
            <pattern>${LOG_PATTERN}</pattern>
            <charset>${LOG_CHARSET}</charset>
        </encoder>
    </appender>

    <!-- 打印所有日志到同一个文件 -->
    <appender name="FILE_ALL" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/${LOG_PREFIX}.log</file>
        <!-- 格式化日志内容 -->
        <encoder>
            <pattern>${LOG_PATTERN}</pattern>
            <charset>${LOG_CHARSET}</charset> <!-- 设置字符集 -->
        </encoder>
        <!-- 日志记录器的滚动策略，按日期，按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 新的日志文件路径名称，%d:日期 %i:i是变量 -->
            <fileNamePattern>${LOG_DIR}/${LOG_PREFIX}%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!--日志文件保留天数-->
            <maxHistory>${MAX_HISTORY}</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- 日志文件的最大大小 -->
                <maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <!-- 此日志文件记录所有级别 -->
    </appender>


    <!-- ======== 异步输出 ======== -->
    <appender name="ASYNC_ALL" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 默认情况下，当blockingQueue的容量高于阈值时（80%），会丢弃ERROR以下级别的日志，如果不希望丢弃日志（既每次都是全量保存），
                                那可以设置为0，但是如果队列满的时候，会丢弃所有插入队列的日志信息，所以建议设置为-1（默认值） -->
        <discardingThreshold>-1</discardingThreshold>
        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
        <queueSize>256</queueSize>
        <!-- 添加附加的appender,最多只能添加一个 -->
        <appender-ref ref="FILE_ALL"/>
    </appender>

    <!-- 指定包的日志输出级别 -->
    <logger name="org.springframework.data.mybatis" level="DEBUG"/>
    <logger name="org.elasticsearch.transport" level="ERROR"/>
    <!-- 日志输出级别 -->
    <root level="${LOG_ROOT_LEVEL}">
        <appender-ref ref="STDOUT"/>

        <!--异步输出日志-->
        <appender-ref ref="ASYNC_ALL"/>
    </root>

</configuration>
