<?xml version="1.0" encoding="utf-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <!-- 定义变量后，可以使“${}”来使用变量 source来源为spring 上下文信息 -->
    <springProperty scope="context" name="springApplicationName" source="spring.application.name"/>
    <springProperty scope="context" name="serverPort" source="server.port"/>
    <springProperty scope="context" name="logFilePath" source="application.log.path" defaultValue="/mortals/app/logs" />
    <springProperty scope="context" name="logLevel" source="application.log.level" defaultValue="INFO" />

    <!-- appender用来格式化日志输出节点，有俩个属性name和class，class用来指定哪种输出策略，常用就是控制台输出策略和文件输出策略 -->
    <!-- 控制台输出策略-->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!--格式化输出：%d表示日期，%thread表示线程名，%-5level：级别从左显示5个字符宽度%msg：日志消息，%n是换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] [%X{traceId}] [%thread] [%.50c\(%L\)] - %msg%n</pattern>
        </encoder>
    </appender>
    <!-- 文件输出策略-->
    <appender name="fileInfo" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] [%X{traceId}] [%thread] [%.50c\(%L\)] - %msg%n</pattern>
        </encoder>
        <file>${logFilePath}/${springApplicationName:-default}/${springApplicationName:-default}-info.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 文件保存策略-->
            <fileNamePattern>${logFilePath}/${springApplicationName:-default}/${springApplicationName:-default}-info.log.%d{yyyyMMdd}</fileNamePattern>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
            <!--日志文件保留天数-->
            <MaxHistory>15</MaxHistory>
        </rollingPolicy>
    </appender>
    <!-- 异常文件输出策略-->
    <appender name="fileError" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] [%X{traceId}] [%thread] [%.50c\(%L\)] - %msg%n</pattern>
        </encoder>
        <file>${logFilePath}/${springApplicationName:-default}/${springApplicationName:-default}-error.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${logFilePath}/${springApplicationName:-default}/${springApplicationName:-default}-error.log.%d{yyyyMMdd}</fileNamePattern>
            <!--日志文件保留天数-->
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
            <MaxHistory>15</MaxHistory>
        </rollingPolicy>
    </appender>

    <root level="${logLevel}">
        <appender-ref ref="console"/>
        <appender-ref ref="fileInfo"/>
        <appender-ref ref="fileError"/>
    </root>

    <!--TRACE < DEBUG < INFO < WARN < ERROR < FATAL -->

    <!--用来设置某一个包或者具体的某一个类的日志打印级别、以及指定<appender>。<logger>仅有一个name属性，一个可选的level和一个可选的additivity属性。-->
    <!-- name 用来指定受此loger约束的某一个包或者具体的某一个类-->
    <!-- level 用来设置打印级别，大小写无关：TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF，还有一个特俗值INHERITED或者同义词NULL，代表强制执行上级的级别。如果未设置此属性，那么当前logger将会继承上级的级别-->
    <!-- additivity 是否向上级logger传递打印信息。默认是true。false：表示只用当前logger的appender-ref。true：表示当前logger的appender-ref和rootLogger的appender-ref都有效。-->

    <logger name="com.mortals" level="${logLevel}" additivity="false">
        <appender-ref ref="console"/>
        <appender-ref ref="fileInfo"/>
        <appender-ref ref="fileError"/>
    </logger>

    <logger name="com.mortals.xhx.module" level="${logLevel}" additivity="false">
        <appender-ref ref="console"/>
        <appender-ref ref="fileInfo"/>
        <appender-ref ref="fileError"/>
    </logger>

<!--    <logger name="com.mortals.xhx.module">
        <level value="debug"/>
    </logger>-->

</configuration>