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配置此处不细说