log4j大家应该再熟悉不过了,log4j2则是log4j的一次比较大的升级,底层使用disruptor重写优化了异步输出日志,性能得到极大提高。笔者曾将log4j、logback、log4j2做过性能对比,log4j2的确表现出绝对的优势。话不多说,下面主要是贴出笔者在项目中不断完善的log4j2配置文件。
pom.xml增加依赖
<!-- 日志log4j2 --> <dependency> <groupId>com.lmax</groupId> <artifactId>disruptor</artifactId> <version>${com-lmax-version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency>log4j2.xml<?xml version="1.0" encoding="UTF-8"?><Configuration status="off"> <Properties> <Property name="LOG_HOME">logs</Property> </Properties> <!--先定义所有的appender --> <Appenders><!-- 优先级从高到低分别是 OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL -->
<!-- 单词解释: Match:匹配 DENY:拒绝 Mismatch:不匹配 ACCEPT:接受 --> <!-- DENY,日志将立即被抛弃不再经过其他过滤器; NEUTRAL,有序列表里的下个过滤器过接着处理日志; ACCEPT,日志会被立即处理,不再经过剩余过滤器。 --> <!--输出日志的格式 %d{yyyy-MM-dd HH:mm:ss, SSS} : 日志生产时间 %p : 日志输出格式 %c : logger的名称 %m : 日志内容,即 logger.info("message") %n : 换行符 %C : Java类名 %L : 日志输出所在行数 %M : 日志输出所在方法名 hostName : 本地机器名 hostAddress : 本地ip地址 --><!-- 控制台 -->
<Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p %t [%c:%L]-%m%n"/> </Console> <!-- lucas_device.log文件 --> <RollingFile name="service_appender" fileName="${LOG_HOME}/lucas_device.log" immediateFlush="false" append="true" filePattern="${LOG_HOME}/$${date:yyyy-MM}/lucas_device-%d{yyyy-MM-dd}-%i.log.gz"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p %t [%c:%L]-%m%n"/> <Filters> <!--如果是error级别拒绝 onMismatch="NEUTRAL",有序列表里的下个过滤器过接着处理日志; --> <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/> <!--如果是info\warn输出 onMismatch="DENY",日志将立即被抛弃不再经过其他过滤器 --> <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/> </Filters> <Policies> <!-- 如果启用此配置,则日志会按文件名生成新压缩文件, 即如果filePattern配置的日期格式为 %d{yyyy-MM-dd HH} ,则每小时生成一个压缩文件, 如果filePattern配置的日期格式为 %d{yyyy-MM-dd} ,则天生成一个压缩文件 --> <TimeBasedTriggeringPolicy/> <!-- 每个日志文件最大512MB --> <SizeBasedTriggeringPolicy size="512MB"/> </Policies> <DefaultRolloverStrategy> <Delete basePath="${LOG_HOME}" maxDepth="2"> <IfFileName glob="*/lucas_device-*.log.gz"/> <!-- 删除30天前的文件 --> <IfLastModified age="30d"/> </Delete> </DefaultRolloverStrategy> </RollingFile> <!-- lucas_device_error.log文件 --> <RollingFile name="service_appender_error" fileName="${LOG_HOME}/lucas_device_error.log" immediateFlush="false" append="true" filePattern="${LOG_HOME}/$${date:yyyy-MM}/lucas_device_error-%d{yyyy-MM-dd}-%i.log.gz"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p %t [%c:%L]-%m%n"/> <Filters> <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/> </Filters> <Policies> <TimeBasedTriggeringPolicy/> <SizeBasedTriggeringPolicy size="512MB"/> </Policies> <DefaultRolloverStrategy> <Delete basePath="${LOG_HOME}" maxDepth="2"> <IfFileName glob="*/lucas_device_error-*.log.gz"/> <IfLastModified age="30d"/> </Delete> </DefaultRolloverStrategy> </RollingFile> <!-- lucas_device_mqtt.log文件 --> <RollingFile name="service_appender_mqtt" fileName="${LOG_HOME}/lucas_device_mqtt.log" immediateFlush="false" append="true" filePattern="${LOG_HOME}/$${date:yyyy-MM}/lucas_device_mqtt-%d{yyyy-MM-dd}-%i.log.gz"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p %t [%c:%L]-%m%n"/> <Policies> <TimeBasedTriggeringPolicy/> <SizeBasedTriggeringPolicy size="512MB"/> </Policies> <DefaultRolloverStrategy> <Delete basePath="${LOG_HOME}" maxDepth="2"> <IfFileName glob="*/lucas_device_mqtt-*.log.gz"/> <IfLastModified age="7d"/> </Delete> </DefaultRolloverStrategy> </RollingFile> <!-- lucas_device_restful.log文件 --> <RollingFile name="service_restful" fileName="${LOG_HOME}/lucas_device_restful.log" immediateFlush="false" append="true" filePattern="${LOG_HOME}/$${date:yyyy-MM}/lucas_device_restful-%d{yyyy-MM-dd}-%i.log.gz"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p %t [%c:%L]-%m%n"www.oushengyule.com/> <Policies> <TimeBasedTriggeringPolicy/> <SizeBasedTriggeringPolicy size="512MB"/> </Policies> <DefaultRolloverStrategy> <Delete basePath="${LOG_HOME}" maxDepth="2"> <IfFileName glob="*/lucas_device_restful-*.log.gz"/> <IfLastModified age="7d"www.meiwanyule.cn /> </Delete> </DefaultRolloverStrategy> </RollingFile> </Appenders><Loggers>
<AsyncRoot level="info" includeLocation="true" additivity="false"> <AppenderRef ref="Console"www.yongshi123.cn/> <AppenderRef ref="service_appender"/> <AppenderRef ref="service_appender_error"/> </AsyncRoot> <AsyncLogger name="com.lucas.device.mqtt.message.MqttMessagePublishSolver" level="info" includeLocation="true" additivity="false"> <AppenderRef ref="Console"/> <AppenderRef ref="service_appender_mqtt"www.chengmingdL.com /> </AsyncLogger> <AsyncLogger name="com.lucas.device.aop.MainLogAspect" level="info" includeLocation="true" additivity="false"> <AppenderRef ref="Console"www.chengmyuLegw.cn/> <AppenderRef ref="service_restful"/> </AsyncLogger> <AsyncLogger name="com.lucas.device.mapper" level="debug" includeLocation="true" additivity="false"> <AppenderRef ref="Console"/> <AppenderRef ref="service_restful"www.yuntianyuL.cn/> </AsyncLogger> </Loggers></Configuration>配置文件主要是异步将系统日志输出到不同文件。lucas_device_error.log文件记录了系统异常日志;lucas_device_restful.log记录的是用一个自定义注解@Logc记录的所有restful请求的日志,以及sql执行语句;lucas_device_mqtt.log记录的是MqttMessagePublishSolver类输出的日志;最后其他日志都会输出到lucas_device.log文件。可以看到,在Loggers内部,我们指定了日志输出的目标文件,而所有日志我们都设置在Console控制台打印出来。自定义日志注解@Logc详细介绍