Java知名的日志有不少,好比:JUL、Log4j、JCL、SLF4J、Logback、Log4j2,那么这些日志框架之间有着怎样的关系?诞生的缘由又是解决什么问题?下面一块儿来看。php
Java有本身的日志框架JUL(Java Util Logging)在java.util.logging下,由于对开发者不友好,使用成本过高和日志级别分类不清晰的问题,全部不多有开发者用。html
由于JUL的缺陷问题,这就给了Log4j机会,全部Log4j一经推出就迅速风靡全球。java
JCL是Jakarta Commons-Logging的缩写,Jakarta在这里指的是一个组织,而不是印度的首都雅加达,Jakarta,一个早期的Apache开源项目,用于管理各个Java子项目,诸如Tomcat, Ant, Maven, Struts, JMeter, Velocity, JMeter, Commons等。2011年12月,在全部子项目都被迁移为独立项目后,Jakarta名称就再也不使用了。git
JCL诞生的初衷是由于Java自身的一些包用了JUL,而Log4j用户使用的有不少,那么JCL就是提供一套API来实现不一样Logger之间的切换。github
SLF4J(Simple Logging Facade For Java)简单日志门面,和JCL功能相似,但JCL有一个致命的缺点就是算法复杂,出现问题难以排除,而SLF4J的诞生就是为了解决JCL的缺点。web
值得一提的是SLF4J的做者就是Log4j的做者。算法
Logback是Log4j的做者的另外一个开源日志组件,与Log4j相比,Logback从新了内核,使它的性能提高了不少,大约是Log4j的10倍,同时占用更小的内存,而且完整的实现了SLF4J API是你能够很方便的切换日志框架。spring
Log4j2有着和Logback相同的功能,但又有本身单用的功能,好比:插件式结构、配置文件优化、异步日志等。apache
Log4j2是Log4j的升级,它比其前身Log4j 1.x提供了重大改进,并提供了Logback中可用的许多改进,同时修复了Logback架构中的一些固有问题。springboot
从GitHub的更新日志来看,Logback已经有半年没有更新了,而做为知名组织的Apache下的Log4j2的更新倒是很是活跃的,Log4j 1.x 于2015年8月中止维护更新了。
GitHub地址
Logback:github.com/qos-ch/logb…
log4j2:github.com/apache/logg…
本文分别来看Logback和Log4j2在Spring Boot中的实现。
开发环境
Spring Boot默认集成了Logback,能够开箱即用,很是方便。由于spring-boot-starter-logging是Logback的日志实现,而Spring Boot启动项spring-boot-starter又依赖了spring-boot-starter-logging,因此Spring Boot就默认集成了Logback,包依赖以下图:
日志是默认控制台输出的,咱们程序启动的时候就使用Logback,以下图所示:
日志组成解读:
日期和时间:毫秒精度,易于排序
日志级别:trace、debug、info、warn、error(日志级别依次从低到高)
进程ID
---
分隔符
线程名称:括在方括号中(能够截断控制台输出)
记录器名称:这一般是源类名(一般缩写)
日志具体信息
若是须要输出日志到文件,只须要在application.properties配置文件设置:logging.file或logging.path,示例以下:
logging.level.root=info
logging.file=D:\\log\\my.log
复制代码
能够经过设置日志的级别,忽略更低级别的日志输出。
注意: logging.file和logging.path设置一个属性便可,若是两个都设置,则以logging.file为主,logging.path无效。
日志文件容量设置:使用“logging.file.max-history”属性为日志最大容量设置,默认10M超过则分割为多个文件。
日志服务在ApplicationContext建立前就初始化了,因此经过设置属性和传统的配置XML文件,能够对日志进行管理和控制。
只须要在src/main/resources下,建立好约定名称的XML文件,便可完成对日志系统的设置,不一样的日志系统有不一样的约定名称,以下列表:
日志 | 名称 |
---|---|
logback | logback-spring.xml, logback-spring.groovy, logback.xml, 或者 logback.groovy |
log4j2 | log4j2-spring.xml 或者 log4j2.xml |
Spring Boot官方建议使用“-spring”的命名规则,进行日志配置,如:logback-spring.xml而不是logback.xml。
固然你也能够自定义日志名称,只须要在application.properties配置便可,代码以下:
logging.config=classpath:logging-config.xml
来看一个logback-spring.xml示例文件:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 日志根目录-->
<springProperty scope="context" name="LOG_HOME" source="logging.path" defaultValue="/data/logs/spring-boot-logback"/>
<!-- 日志级别 -->
<springProperty scope="context" name="LOG_ROOT_LEVEL" source="logging.level.root" defaultValue="DEBUG"/>
<!-- 标识这个"STDOUT" 将会添加到这个logger -->
<springProperty scope="context" name="STDOUT" source="log.stdout" defaultValue="STDOUT"/>
<!-- 日志文件名称-->
<property name="LOG_PREFIX" value="spring-boot-logback" />
<!-- 日志文件编码-->
<property name="LOG_CHARSET" value="UTF-8" />
<!-- 日志文件路径+日期-->
<property name="LOG_DIR" value="${LOG_HOME}/%d{yyyyMMdd}" />
<!--对日志进行格式化-->
<property name="LOG_MSG" value="- | [%X{requestUUID}] | [%d{yyyyMMdd HH:mm:ss.SSS}] | [%level] | [${HOSTNAME}] | [%thread] | [%logger{36}] | --> %msg|%n "/>
<!--文件大小,默认10MB-->
<property name="MAX_FILE_SIZE" value="50MB" />
<!-- 配置日志的滚动时间 ,表示只保留最近 10 天的日志-->
<property name="MAX_HISTORY" value="10"/>
<!--输出到控制台-->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- 输出的日志内容格式化-->
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>${LOG_MSG}</pattern>
</layout>
</appender>
<!--输出到文件-->
<appender name="0" class="ch.qos.logback.core.rolling.RollingFileAppender">
</appender>
<!-- 定义 ALL 日志的输出方式:-->
<appender name="FILE_ALL" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--日志文件路径,日志文件名称-->
<File>${LOG_HOME}/all_${LOG_PREFIX}.log</File>
<!-- 设置滚动策略,当天的日志大小超过 ${MAX_FILE_SIZE} 文件大小时候,新的内容写入新的文件, 默认10MB -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件路径,新的 ALL 日志文件名称,“ i ” 是个变量 -->
<FileNamePattern>${LOG_DIR}/all_${LOG_PREFIX}%i.log</FileNamePattern>
<!-- 配置日志的滚动时间 ,表示只保留最近 10 天的日志-->
<MaxHistory>${MAX_HISTORY}</MaxHistory>
<!--当天的日志大小超过 ${MAX_FILE_SIZE} 文件大小时候,新的内容写入新的文件, 默认10MB-->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<!-- 输出的日志内容格式化-->
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>${LOG_MSG}</pattern>
</layout>
</appender>
<!-- 定义 ERROR 日志的输出方式:-->
<appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 下面为配置只输出error级别的日志 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<OnMismatch>DENY</OnMismatch>
<OnMatch>ACCEPT</OnMatch>
</filter>
<!--日志文件路径,日志文件名称-->
<File>${LOG_HOME}/err_${LOG_PREFIX}.log</File>
<!-- 设置滚动策略,当天的日志大小超过 ${MAX_FILE_SIZE} 文件大小时候,新的内容写入新的文件, 默认10MB -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件路径,新的 ERR 日志文件名称,“ i ” 是个变量 -->
<FileNamePattern>${LOG_DIR}/err_${LOG_PREFIX}%i.log</FileNamePattern>
<!-- 配置日志的滚动时间 ,表示只保留最近 10 天的日志-->
<MaxHistory>${MAX_HISTORY}</MaxHistory>
<!--当天的日志大小超过 ${MAX_FILE_SIZE} 文件大小时候,新的内容写入新的文件, 默认10MB-->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<!-- 输出的日志内容格式化-->
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>${LOG_MSG}</Pattern>
</layout>
</appender>
<!-- additivity 设为false,则logger内容不附加至root ,配置以配置包下的全部类的日志的打印,级别是 ERROR-->
<logger name="org.springframework" level="ERROR" />
<logger name="org.apache.commons" level="ERROR" />
<logger name="org.apache.zookeeper" level="ERROR" />
<logger name="com.alibaba.dubbo.monitor" level="ERROR"/>
<logger name="com.alibaba.dubbo.remoting" level="ERROR" />
<!-- ${LOG_ROOT_LEVEL} 日志级别 -->
<root level="${LOG_ROOT_LEVEL}">
<!-- 标识这个"${STDOUT}"将会添加到这个logger -->
<appender-ref ref="${STDOUT}"/>
<!-- FILE_ALL 日志输出添加到 logger -->
<appender-ref ref="FILE_ALL"/>
<!-- FILE_ERROR 日志输出添加到 logger -->
<appender-ref ref="FILE_ERROR"/>
</root>
</configuration>
复制代码
在代码中使用日志,只须要使用以下代码:
private Logger logger = LoggerFactory.getLogger(this.getClass());
//...
logger.debug("this is debug");
logger.info("this is info");
复制代码
Spring Boot添加Log4j2依赖的同时,须要排除Logback依赖,配置pom.xml代码以下:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions><!-- 去掉logback配置 -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency> <!-- 引入log4j2依赖 -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
</dependencies>
复制代码
添加log4j2-spring.xml文件在src/main/resources文件下,配置文件代码以下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<Appenders>
<Console name="CONSOLE" target="SYSTEM_OUT">
<PatternLayout charset="UTF-8" pattern="[%-5p] %d %c - %m%n" />
</Console>
<File name="File" fileName="D:\\mylog.log">
<PatternLayout pattern="%m%n" />
</File>
</Appenders>
<Loggers>
<root level="info">
<AppenderRef ref="CONSOLE" />
<AppenderRef ref="File" />
</root>
</Loggers>
</configuration>
复制代码
输入日志到控制台和D盘mylog.log文件中。
到此为止,已经完成了log4j2的集成,运行项目,查看日志。
参考资料
JAVA日志的前世此生:www.cnblogs.com/xiexj/p/941…