一、简介

Java知名的日志有很多,比如:JUL、Log4j、JCL、SLF4J、Logback、Log4j2,那么这些日志框架之间有着怎样的关系?诞生的原因又是解决什么问题?下面一起来看。

1.1 JUL

Java有自己的日志框架JUL(Java Util Logging)在java.util.logging下,因为对开发者不友好,使用成本太高和日志级别分类不清晰的问题,所有很少有开发者用。

1.2 Log4j

因为JUL的缺陷问题,这就给了Log4j机会,所有Log4j一经推出就迅速风靡全球。

1.3 JCL

JCL是Jakarta Commons-Logging的缩写,Jakarta在这里指的是一个组织,而不是印度的首都雅加达,Jakarta,一个早期的Apache开源项目,用于管理各个Java子项目,诸如Tomcat, Ant, Maven, Struts, JMeter, Velocity, JMeter, Commons等。2011年12月,在所有子项目都被迁移为独立项目后,Jakarta名称就不再使用了。

JCL诞生的初衷是因为Java自身的一些包用了JUL,而Log4j用户使用的有很多,那么JCL就是提供一套API来实现不同Logger之间的切换。

1.4 SLF4J

SLF4J(Simple Logging Facade For Java)简单日志门面,和JCL功能类似,但JCL有一个致命的缺点就是算法复杂,出现问题难以排除,而SLF4J的诞生就是为了解决JCL的缺点。

值得一提的是SLF4J的作者就是Log4j的作者。

1.5 Logback

Logback是Log4j的作者的另一个开源日志组件,与Log4j相比,Logback重新了内核,使它的性能提升了很多,大约是Log4j的10倍,同时占用更小的内存,并且完整的实现了SLF4J API是你可以很方便的切换日志框架。

1.6 Log4j2

Log4j2有着和Logback相同的功能,但又有自己单用的功能,比如:插件式结构、配置文件优化、异步日志等。

Log4j2是Log4j的升级,它比其前身Log4j 1.x提供了重大改进,并提供了Logback中可用的许多改进,同时修复了Logback架构中的一些固有问题。

从GitHub的更新日志来看,Logback已经有半年没有更新了,而作为知名组织的Apache下的Log4j2的更新却是非常活跃的,Log4j 1.x 于2015年8月停止维护更新了。

GitHub地址

Logback:https://github.com/qos-ch/logback

log4j2:https://github.com/apache/logging-log4j2

本文分别来看Logback和Log4j2在Spring Boot中的实现。

二、Logback使用

开发环境

  • JDK 8
  • Spring Boot 2.0.4 RELEASE
  • Maven
  • Windows 10
  • IDEA 2018.2

2.1 Logback的使用

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

  • ---分隔符

  • 线程名称:括在方括号中(可以截断控制台输出)

  • 记录器名称:这通常是源类名(通常缩写)

  • 日志具体信息

2.2 输入文件

如果需要输出日志到文件,只需要在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超过则分割为多个文件。

2.3 自定义日志配置

日志服务在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>

2.4 代码中使用日志

在代码中使用日志,只需要使用如下代码:

private Logger logger = LoggerFactory.getLogger(this.getClass());
//...
logger.debug("this is debug");
logger.info("this is info");

三、Log4j2集成

3.1 配置依赖组件

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>

3.2 自定义日志配置

添加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的集成,运行项目,查看日志。

示例源码:https://github.com/vipstone/springboot-example/tree/master/springboot-logging

参考资料

JAVA日志的前世今生:https://www.cnblogs.com/xiexj/p/9417128.html

Spring Boot(十)Logback和Log4j2集成与日志发展史相关推荐

  1. spring boot使用logback时控制台不打印日志,使用slf4j解决不打印日志问题

    maven项目在pom中添加slf4j依赖 <!--用于解决日志不打印问题--> <dependency><groupId>org.slf4j</groupI ...

  2. logback redis_使用Spring Boot和Logback登录到Redis

    logback redis 在进行集中式日志记录时,例如使用Elasticsearch,Logstash和Kibana或Graylog2,您可以为Java应用程序提供多个选项. 您既可以编写标准的应用 ...

  3. 使用Spring Boot和Logback登录到Redis

    在进行集中式日志记录时,例如使用Elasticsearch,Logstash和Kibana或Graylog2,您可以为Java应用程序提供几个选项. 您既可以编写标准的应用程序日志,也可以使用Logs ...

  4. Spring Boot(十四):spring boot整合shiro-登录认证和权限管理

    Spring Boot(十四):spring boot整合shiro-登录认证和权限管理 使用Spring Boot集成Apache Shiro.安全应该是互联网公司的一道生命线,几乎任何的公司都会涉 ...

  5. Spring Boot (十五): Spring Boot + Jpa + Thymeleaf 增删改查示例

    <p>这篇文章介绍如何使用 Jpa 和 Thymeleaf 做一个增删改查的示例.</p> 先和大家聊聊我为什么喜欢写这种脚手架的项目,在我学习一门新技术的时候,总是想快速的搭 ...

  6. spring boot配置logback日志

    spring boot配置logback日志 在上一篇spring boot入门里提过,Spring Boot默认的日志打印是logback,所以配置logback日志会很简单,但是也有注意的地方. ...

  7. Spring Boot - Thymeleaf模板简介以及集成

    文章目录 Spring Boot - Thymeleaf模板简介以及集成 1.什么是Thymeleaf? 2.标准表达式 2.1 变量表达式 2.2 选择表达式/星号表达式 2.3 URL表达式 2. ...

  8. 搭建Spring Boot2.X集成Hibernate5项目,并集成传统SSH老项目的安全认证组件,以Spring Boot方式开发项目并集成到老系统

    搭建Spring Boot2.X集成Hibernate5项目,并集成传统SSH老项目的安全认证组件,以Spring Boot方式开发项目并集成到老系统 场景 可行性分析 搭建Spring Boot集成 ...

  9. spring boot 配置logback,logback不打印日志

    spring boot 日志简介 spring boot只依赖 Commons Logging API,而不依赖其他日志(jul.logback.log4j).要想使用logback,必须引入jcl- ...

最新文章

  1. 提供一个基于.NET的加密/解密算法
  2. Linux手动启动、停止多个服务用的shell脚本
  3. 「神策 2021 数据驱动大会」主会场回顾
  4. Go实战--golang中使用redis(redigo和go-redis/redis这个已测试)
  5. spark.mllib:回归算法
  6. mongDB update 修改器
  7. ES6-6 - this指向、箭头函数基本形式、rest运算符
  8. 即时大数据流处理=即时风暴
  9. mysql实用工教程_MYSQL实用教程
  10. 科学与技术计算机图片解释,【图片】计算机-科普—都是从网上找的【计算机科学与技术吧】_百度贴吧...
  11. 擷取 GridView 資料列的欄位值集合
  12. java与数据库连接odbc_详解java数据库连接之JDBC-ODBC桥连方式
  13. 数字电视打开一直连接服务器50%,广电有线电视宽带故障判断及处理
  14. establish connection
  15. 六十星系之31破军独坐子午
  16. 饭前跑步还是饭后跑步 - 饭后多久跑步
  17. 计算器(Java)课设
  18. flac - 安装使用
  19. SELinux 的工作模式(Disabled、Permissive和Enforcing)
  20. 编写第一个 Arduino 程序

热门文章

  1. 《Web安全之机器学习入门》一 第3章 机器学习概述
  2. Controller计算值传到jsp页面,用session传值
  3. I00037 亏数(Deficient number)
  4. angular的$http发送post,get请求无法传送参数的问题
  5. 关于 java 实现 语音朗读
  6. win2003服务器 虚拟主机安全配置
  7. 更改临时文件夹的路径
  8. Java使用继承的语法是,Java基础语法八 继承
  9. linux mysql python包_03_mysql-python模块, linux环境下python2,python3的
  10. chrome解决跨域(CORS)问题---chrome插件