SpringCloud整合log4j2总结
SpringCloud整合log4j2
- 常用日志框架
- 日志门面slf4j
- 为什么要选用log4j2
- 整合步骤
常用日志框架
- java.util.logging:是JDK在1.4版本中引入的Java原生日志框架
- Log4j:Apache的一个开源项目,可以控制日志信息输送的目的地是控制台、文件、GUI组件等,可以控制每一条日志的输出格式,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。虽然已经停止维护了,但目前绝大部分企业都是用的log4j。
- LogBack:是Log4j的一个改良版本
- Log4j2:Log4j2已经不仅仅是Log4j的一个升级版本了,它从头到尾都被重写了
日志门面slf4j
上述介绍的是一些日志框架的实现,这里我们需要用日志门面来解决系统与日志实现框架的耦合性。SLF4J,即简单日志门面(Simple Logging Facade for Java),它不是一个真正的日志实现,而是一个抽象层( abstraction layer),它允许你在后台使用任意一个日志实现。
前面介绍的几种日志框架一样,每一种日志框架都有自己单独的API,要使用对应的框架就要使用其对应的API,这就大大的增加应用程序代码对于日志框架的耦合性。
使用了slf4j后,对于应用程序来说,无论底层的日志框架如何变,应用程序不需要修改任意一行代码,就可以直接上线了。
为什么要选用log4j2
相比与其他的日志系统,log4j2丢数据这种情况少;disruptor技术,在多线程环境下,性能高于logback等10倍以上;利用jdk1.5并发的特性,减少了死锁的发生;
贴上几张网上的日志框架性能测评图:
- 可以看到在同步日志模式下, Logback的性能是最糟糕的.
- log4j2的性能无论在同步日志模式还是异步日志模式下都是最佳的.
log4j2优越的性能其原因在于log4j2使用了LMAX,一个无锁的线程间通信库代替了,logback和log4j之前的队列. 并发性能大大提升。
整合步骤
- 引入jar包
springboot默认是用logback的日志框架的,所以需要排除logback,不然会出现jar依赖冲突的报错。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions> <!-- 去除springboot默认的logback配置-->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 加入log4j2配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<!-- 如果引入一下依赖,也需要去除logback配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
配置文件
如果自定义了文件名,需要在application.yml中配置
默认名log4j2-spring.xml,就省下了在application.yml中配置logging.config = classpath:log4j2-dev.xml
配置文件模板
log4j是通过一个.properties的文件作为主配置文件的,而现在的log4j2则已经弃用了这种方式,采用的是.xml,.json或者.jsn这种方式来做,可能这也是技术发展的一个必然性,因为properties文件的可阅读性真的是有点差。这里给出一个模版,供大家参考。
<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出 -->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数 -->
<configuration status="INFO" monitorInterval="30">
<!--<contextName>log4j2</contextName>-->
<properties>
<!--${sys:catalina.home}表示linux中环境变量中的tomcat根目录 用户主目录-->
<!--原来用logback时候在统一配置中心也配置一个logging.path=/opt/tomcat-log/${spring.application.name} LOG_PATH是内置变量-->
<!--${sys:user.home} 用户主目录-->
<Property name="log_path">${sys:user.home}/logs</Property>
<!-- 保留日志天数 D H M S 分别对应天 小时 分钟 秒 -->
<property name="KEEP_LOG_DAY">60D</property>
<!-- 日志切割的最小单位 -->
<property name="EVERY_FILE_SIZE">5M</property>
</properties>
<!--先定义所有的appender -->
<appenders>
<console name="Console" target="SYSTEM_OUT">
<!--输出日志的格式 -->
<PatternLayout charset="UTF-8" pattern="[%d][%t][%p][%c:%L] %m%n"/>
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" />
</console>
<!--这个输出控制台的配置 -->
<!--<console name="Console" target="SYSTEM_OUT" follow="false">-->
<!--<!–输出日志的格式 –>-->
<!--<PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n" />-->
<!--</console>-->
<!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档 -->
<RollingFile name="RollingFileInfo" fileName="${log_path}/info-latest.log" filePattern="${log_path}/$${date:yyyy-MM-dd}/info-%d{yyyy-MM-dd}-%i.log">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" />
<!--<Filters>-->
<!--<ThresholdFilter level="INFO"/>-->
<!--<ThresholdFilter level="WARN" onMatch="DENY"-->
<!--onMismatch="NEUTRAL"/>-->
<!--</Filters>-->
<PatternLayout charset="UTF-8" pattern="[%d][%t][%p][%c:%L] %m%n"/>
<Policies>
<!-- 归档每天的文件 -->
<!--<TimeBasedTriggeringPolicy interval="1" modulate="true"/>-->
<TimeBasedTriggeringPolicy />
<!-- 限制单个文件大小 -->
<SizeBasedTriggeringPolicy size="${EVERY_FILE_SIZE}"/>
</Policies>
<!-- 限制每天文件个数 --> <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了100 -->
<DefaultRolloverStrategy max="256">
<Delete basePath="${log_path}/" maxDepth="3">
<IfFileName glob="*/*info*.log"/>
<IfLastModified age="${KEEP_LOG_DAY}"/>
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
<RollingFile name="RollingFileWarn" fileName="${log_path}/warn-latest.log" filePattern="${log_path}/$${date:yyyy-MM-dd}/warn-%d{yyyy-MM-dd}-%i.log">
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY" />
<!--<PatternLayout charset="UTF-8" pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n" />-->
<PatternLayout charset="UTF-8" pattern="[%d][%t][%p][%c:%L] %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="${EVERY_FILE_SIZE}" />
</Policies>
<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了100 -->
<DefaultRolloverStrategy max="256">
<Delete basePath="${log_path}/" maxDepth="3">
<IfFileName glob="*/*warn*.log"/>
<IfLastModified age="${KEEP_LOG_DAY}"/>
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
<RollingFile name="RollingFileError" fileName="${log_path}/error-latest.log" filePattern="${log_path}/$${date:yyyy-MM-dd}/error-%d{yyyy-MM-dd}-%i.log">
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY" />
<!--<PatternLayout charset="UTF-8" pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n" />-->
<PatternLayout charset="UTF-8" pattern="[%d][%t][%p][%c:%L] %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="1${EVERY_FILE_SIZE}" />
</Policies>
<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了100 -->
<DefaultRolloverStrategy max="256">
<Delete basePath="${log_path}/" maxDepth="3">
<IfFileName glob="*/*error*.log"/>
<IfLastModified age="180D"/>
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
</appenders>
<!--然后定义logger,只有定义了logger并引入的appender,appender才会生效 -->
<loggers>
<!--过滤掉spring和mybatis的一些无用的DEBUG信息 -->
<logger name="org.springframework" level="INFO"></logger>
<logger name="org.mybatis" level="DEBUG"></logger>
<!--<root level="all">-->
<root level="ALL">
<appender-ref ref="Console" />
<appender-ref ref="RollingFileInfo" />
<appender-ref ref="RollingFileWarn" />
<appender-ref ref="RollingFileError" />
</root>
<logger name="cn.timebusker.util" level="INFO">
<appender-ref ref="RollingFileInfo" />
</logger>
</loggers>
</configuration>
参考链接:Springboot整合log4j2日志全解
还没有评论,来说两句吧...