log4j2 配置

log4j2配置要求:
     1. 控制台打印系统错误级以上信息
     2. 控制台打印业务日志
     3. 系统及业务信息日志保存到日志文件
     4. 系统及业务警告日志保存到日志文件
     5. 系统及业务错误级以上日志保存到日志文件
     6. 业务日志保存到数据库
环境:
    Spring5、Servlet3和Mybaits3
其中邮件发送用到:
    javax.mail-1.4.7
    javax.activation-1.1
Tomcat配置的阿里巴巴Durid数据源(JNDI名称引用)
具体配置代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<!--
日志配置要求:
    1. 控制台打印系统错误级以上信息
    2. 控制台打印业务日志
    3. 系统及业务信息日志保存到日志文件
    4. 系统及业务警告日志保存到日志文件
    5. 系统及业务错误级以上日志保存到日志文件
    6. 业务日志保存到数据库
-->
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<!--package  -->
<configuration name="log4j2Configuration" status="WARN" monitorInterval="30" packages="org.apache.logging.log4j.core.layout">

    <!-- 定义配置参数 -->
    <Properties>
        <!-- 系统运行日志文件名 -->
        <Property name="infoLogFile">${sys:catalina.home}/logs/info.log</Property>
        <!-- 运行日志归档存储位置 -->
        <!-- ${sys:catalina.home}/logs:为Tomcat根目录下的logs位置; ./logs:为系统classes/logs目录;默认logs/: 为tomcat/bin/logs目录 -->
        <Property name="infoLogFilePattern">${sys:catalina.home}/logs/${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log</Property>
        <!-- 系统警告日志文件名 -->
        <Property name="warnLogFile">${sys:catalina.home}/logs/warn.log</Property>
        <!-- 警告日志归档存储位置 -->
        <Property name="warnLogFilePattern">${sys:catalina.home}/logs/${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log</Property>
        <!-- 系统错误日志文件名 -->
        <Property name="errorLogFile">${sys:catalina.home}/logs/error.log</Property>
        <!-- 错误日志归档存储位置 -->
        <Property name="errorLogFilePattern">${sys:catalina.home}/logs/${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log</Property>

        <!-- 系统所有日志格式为一种 -->
        <!-- 2019-06-08 11:21:15.750 错误 [http-nio-8080-exec-5] UsersCtrl 系统错误 -->
        <!--<Property name="LogLayoutPattern">%d{yyyy-MM-dd HH:mm:ss.SSS} %level{DEBUG=详细, INFO=信息, WARN=警告, ERROR=错误, TRACE=严重} [%t] %c{1} %m%n</Property>-->
        <!-- 2019-06-08 12:09:44.523 警告 [http-nio-8080-exec-5] pers.yanno.dessert.controller.UsersCtrl 系统警告 -->
        <Property name="LogLayoutPattern">%d{yyyy-MM-dd HH:mm:ss.SSS} %level{DEBUG=详细, INFO=信息, WARN=警告, ERROR=错误, TRACE=严重} [%t] %c %m%n</Property>
    </Properties>

    <!--先定义所有的appender-->
    <appenders>
        <!--这个输出控制台的配置-->
        <console name="Console" target="SYSTEM_OUT">
            <!--日志输出控制台格式-->
            <PatternLayout pattern="${LogLayoutPattern}"/>
            <!-- 日志过滤 -->
            <Filters>
                <!-- 阀值过滤 警告及以上日志接受,其他拒绝 -->
                <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
        </console>

        <!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
        <RollingFile name="RollingFileInfo" fileName="${infoLogFile}" filePattern="${infoLogFilePattern}">
            <!-- 日志保存文件格式-->
            <PatternLayout pattern="${LogLayoutPattern}"/>
            <!-- 日志过滤 -->
            <Filters>
                <!-- 阀值过滤只接受info级别日志,其他拒绝 -->
                <ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
                <!-- 标记过滤, 在指定标记点记录日志
                <MarkerFilter marker="FLOW" onMatch="DENY" onMismatch="NEUTRAL"/>-->
            </Filters>
            <Policies>
                <!-- 按天分日志文件 -->
                <TimeBasedTriggeringPolicy/>
                <!-- 按大小分日志文件,日志超过100M后新建日志文件,原文件归档 -->
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
            <!-- 同类型日志文件最大个数,该类日志文件最大归档数量,超过20个后最早的日志文件将被覆盖 -->
            <DefaultRolloverStrategy max="5"/>
        </RollingFile>

        <RollingFile name="RollingFileWarn" fileName="${warnLogFile}" filePattern="${warnLogFilePattern}">
            <PatternLayout pattern="${LogLayoutPattern}"/>
            <Filters>
                <ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
            <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了5 -->
            <DefaultRolloverStrategy max="5"/>
        </RollingFile>

        <RollingFile name="RollingFileError" fileName="${errorLogFile}" filePattern="${errorLogFilePattern}">
            <PatternLayout pattern="${LogLayoutPattern}"/>
            <Filters>
                <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="50 MB"/>
            </Policies>
            <DefaultRolloverStrategy max="3"/>
        </RollingFile>

        <!-- 数据库 -->
        <JDBC name="Database" tableName="user.syslog">
            <!-- 通过与DataSource绑定的JNDI名称配置JDBCAppender -->
            <DataSource jndiName="java:comp/env/jdbc/OracleDataSource" />
            <Column name="requestTime" isEventTimestamp="true" />
            <Column name="logLevel" pattern="%level" />
            <column name="requestUser" pattern="%X{user}" />
            <Column name="requestResult" pattern="%message" />
        </JDBC>

        <!-- 日志发送到邮箱 -->
        <SMTP name="Mail" subject="System Error Log" to="def@163.net" from="abc@126.com"
              replyTo="abc@126.com" smtpProtocol="smtp" smtpHost="smtp.126.com"
              smtpPort="25" bufferSize="50" smtpDebug="false" smtpPassword="password"
              smtpUsername="abc@126.com">
            <!-- 输出格式:2019-06-06 10:24:58,782 ERROR [UsersCtrl:38] 删除用户信息错误 -->
            <PatternLayout charset="UTF-8" pattern="%d %p [%c{1}:%L] %m%n"/>
            <Filters>
                <!-- 阀值过滤 info及以上日志接受,其他拒绝 -->
                <ThresholdFilter level="FATAL" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
        </SMTP>

    </appenders>
    <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
    <loggers>
        <!--过滤掉spring和mybatis的一些无用的DEBUG信息 -->
        <logger name="org.springframework" level="DEBUG"/>
        <logger name="org.mybatis" level="DEBUG"/>
        <!-- 开启mybatis的sql日志, name和mybatis-config.xml的logPrefix一致 . 级别为debug或trace-->
        <Logger name="pers.yanno.dessert.mapper" level="Debug" additivity="false">
            <appender-ref ref="Console"/>
            <appender-ref ref="RollingFileInfo"/>
            <appender-ref ref="RollingFileWarn"/>
            <appender-ref ref="RollingFileError"/>
            <appender-ref ref="Mail"/>
        </Logger>
        <!-- 开启系统功能日志记录 -->
        <logger name="pers.yanno.dessert.controller" level="INFO" additivity="false">
            <appender-ref ref="Console"/>
            <appender-ref ref="RollingFileInfo"/>
            <appender-ref ref="RollingFileWarn"/>
            <appender-ref ref="RollingFileError"/>
            <appender-ref ref="Mail"/>
            <appender-ref ref="Database"/>
        </logger>
        <root level="INFO">
            <appender-ref ref="Console" level="WARN"/>
            <appender-ref ref="RollingFileInfo"/>
            <appender-ref ref="RollingFileWarn"/>
            <appender-ref ref="RollingFileError"/>
            <appender-ref ref="Mail"/>
        </root>
    </loggers>
</configuration>

关于Spring5+Mybaits3以及JDNI配置此处不细说