spring boot 学习(六)spring boot 各版本中使用 log4j2 记录日志
spring boot 各版本中使用 log4j2 记录日志
前言
Spring Boot中默认日志工具是 logback,只不过我不太喜欢 logback。为了更好支持 spring boot 框架,我使用 log4j。
spring boot 各版本与 log4j 的支持情况
1. spring boot 1.2.X 版本
spring boot 1.2.X 版本一般建议使用默认日志工具(logback),也可以使用 log4j。
但,注意的是:Spring Boot 1.2.4.RELEASE包含一个bug,github上关于该问题的解释。所以,当你通过application.properties定义日志级别时,该错误会更改父记录器级别,在最差情况下会更改根记录器级别。虽然这个bug是修复在1.2.6.RELEASE,我建议至少使用1.2.8.RELEASE(如果你想坚持1.2.x)。
因为 spring boot 现在仍然在快速发展阶段,版本更新较快,有时候就会因为版本问题而出现各种奇奇怪怪的bug。
2. spring boot 1.3.X 版本
spring boot 从 1.3.X 版本开始支持 slf4j+log4j/log4j2。
* 首先,先解决为什么使用 SL4J Facade?
对于这个问题,网上已经有许多精彩地点答案了,我就直接附上其中一篇的地址了:为什么要使用SLF4J而不是Log4J。
同时,附上一张工作流程图:
然后,就是在自己的 springboot 项目中使用 log4j。
补充一下,由于方法一样,我将slf4j+log4j2放到了1.4.X版本中来应用。
1.创建一个1.3.X版本的 spring boot 项目(记得排除logback-classic的依赖)。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</exclusion>
</exclusions>
</dependency>
2.引入 SL4J 依赖。
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.19</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.5</version>
</dependency>
3.引入 LOG4J 依赖。
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-jcl</artifactId>
<version>2.5</version>
</dependency>
顺便解释一下,log4j-jcl工件是Apache Log4J Commons Logging Bridge。 如果你打算将Spring Boot application.properties日志配置路由到Log4J文件追加器,那么它是必需的。
4.添加一个测试Controller
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class LoggerController {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@RequestMapping("/mylog")
public String index(){
logger.debug("This is a debug message");
logger.info("This is an info message");
logger.warn("This is a warn message");
logger.error("This is an error message");
return "success";
}
}
5.在src/main/resources目录下加入log4j.properties配置文件
这个,与 spring 框架下的 log4j.properties 通常配置一样,我就简单提供一个。
#LOG4J配置
#设定root日志的输出级别为INFO,appender为控制台输出stdout,文件输出为file
log4j.rootLogger=INFO,stdout,file
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%-5p]-[%d{yyyy-MM-dd HH:mm:ss}]-[%c:%L]: %m%n #只打印级别为ERROR或以上的消息。
log4j.logger.noModule=FATAL #对 com.test 包下的配置
log4j.logger.com.test=DEBUG
log4j.logger.org.eclipse.jetty=WARN
log4j.logger.freemarker=WARN
log4j.logger.com.mchange=WARN #文件输出配置
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log.log
log4j.appender.file.MaxFileSize=10MB
log4j.appender.file.MaxBackupIndex=5
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%-5p]-[%d{yyyy-MM-dd HH:mm:ss}]-[%c:%L]: %m%n
6.启动项目访问 http://localhost:8080/mylog 就可以在 log.log 文件与控制台中看到日志打印的信息。
3. spring boot 1.4.X 版本
从 spring boot 1.4开始的版本就要用log4j2
1.将上一个项目中有关 log4j 与 slf4j 的有关依赖全部去掉,因为 springboot 已经帮我们集合好了。
<!--去掉springboot本身日志依赖-->
<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> <!--log4j2-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
2.添加 log4j2.xml 文件(与 application.properties 同级)。
<?xml version="1.0" encoding="UTF-8"?>
<!--启动项设置为 trace,加载 springboot 启动内部各种详细输出-->
<Configuration status="trace">
<Appenders>
<!--添加一个控制台追加器-->
<Console name="Console" target="SYSTEM_OUT" follow="true">
<PatternLayout>
<pattern>[%-5p] %d %c - %m%n</pattern>
</PatternLayout>
</Console>
<!--添加一个文本追加器,文件位于根目录下,名为log.log-->
<File name="File" fileName="log.log">
<PatternLayout>
<pattern>[%-5p] %d %c - %m%n</pattern>
</PatternLayout>
</File>
</Appenders>
<Loggers>
<Logger name="com.github" level="debug" />
<!--记录 qg.fangrui.boot 包及其子包 debug 及其以上的记录,并输出到文件中-->
<Logger name="qg.fangrui.boot" level="debug">
<!-- AppenderRef 可以控制文件输出对象-->
<AppenderRef ref="File" />
</Logger>
<!--根记录全部输出到控制台上-->
<Root level="debug">
<AppenderRef ref="Console" />
</Root>
</Loggers>
</Configuration>
3.在 application.properties 中加入配置文件的扫描位置
logging.config=classpath:log4j2.xml
4.再次启动并访问 http://localhost:8080/mylog
控制台输出日志:
日志文件:
4. springboot 1.4.1.RELEASE + slf4j + log4j2
参考项目地址:https://github.com/FunriLy/springboot-study/tree/master/%E6%A1%88%E4%BE%8B2
spring boot 学习(六)spring boot 各版本中使用 log4j2 记录日志的更多相关文章
- spring cloud学习(六)Spring Cloud Config
Spring Cloud Config 参考个人项目 参考个人项目 : (希望大家能给个star~) https://github.com/FunriLy/springcloud-study/tree ...
- Spring boot 学习六 spring 继承 mybatis (基于注解)
MyBatis提供了多个注解如:@InsertProvider,@UpdateProvider,@DeleteProvider和@SelectProvider,这些都是建立动态语言和让MyBatis执 ...
- Spring Cloud 学习 (六) Spring Cloud Config
在实际开发过程中,每个服务都有大量的配置文件,例如数据库的配置.日志输出级别的配置等,而往往这些配置在不同的环境中也是不一样的.随着服务数量的增加,配置文件的管理也是一件非常复杂的事 在微服务架构中, ...
- Spring Cloud 学习 之 Spring Cloud Eureka(源码分析)
Spring Cloud 学习 之 Spring Cloud Eureka(源码分析) Spring Boot版本:2.1.4.RELEASE Spring Cloud版本:Greenwich.SR1 ...
- Spring Cloud 学习 之 Spring Cloud Eureka(搭建)
Spring Boot版本:2.1.4.RELEASE Spring Cloud版本:Greenwich.SR1 文章目录 搭建服务注册中心: 注册服务提供者: 高可用注册中心: 搭建服务注册中心: ...
- Spring Cloud学习笔记--Spring Boot初次搭建
1. Spring Boot简介 初次接触Spring的时候,我感觉这是一个很难接触的框架,因为其庞杂的配置文件,我最不喜欢的就是xml文件,这种文件的可读性很不好.所以很久以来我的Spring学习都 ...
- Spring Boot学习笔记——Spring Boot与MyBatis的集成(项目示例)
1.准备数据库环境 # 创建数据库 CREATE DATABASE IF NOT EXISTS zifeiydb DEFAULT CHARSET utf8 COLLATE utf8_general_c ...
- spring cloud学习(六) 配置中心-自动更新
上一篇学习了spring cloud config的基本使用,但发现有个问题,就是每次更改配置后,都需要重启服务才能更新配置,这样肯定是不行的.在上网查资料了解后,spring cloud支持通过AM ...
- spring学习 六 spring与mybatis整合
在mybatis学习中有两种配置文件 :全局配置文件,映射配置文件.mybatis和spring整合,其实就是把mybatis中的全局配置文件的配置内容都变成一个spring容器的一个bean,让sp ...
随机推荐
- 20145307陈俊达_安卓逆向分析_APKtools分析smail
20145307陈俊达_安卓逆向分析_APKtools分析smail 引言 真刺激呢!到了第二篇博客了,难度开始加大,之前是简单的dex2jar和有图形界面的jd-gui,现在来隆重介绍强大的反汇编工 ...
- Timer,TimerTask,Handler
新建一个定时器线程,通过此线程每一秒发送数据到Handler,然后通过Handler来修改UI. 1.获得Handler,Timer,TimerTask对象. Handler handler=new ...
- ZooKeeper参数调优
zookeeper的默认配置文件为zookeeper/conf/zoo_sample.cfg,需要将其修改为zoo.cfg.其中各配置项的含义,解释如下: 1.tickTime:Client-Serv ...
- Python3基础 dict items 以元组的形式打印出字典的每一个项
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- RNN网络【转】
本文转载自:https://zhuanlan.zhihu.com/p/29212896 简单的Char RNN生成文本 Sherlock I want to create some new thing ...
- 深入理解JavaScript的变量作用域
在学习JavaScript的变量作用域之前,我们应当明确几点: JavaScript的变量作用域是基于其特有的作用域链的. JavaScript没有块级作用域. 函数中声明的变量在整个函数中都有定义. ...
- c++类定义代码的分离
类文件 实际工程中,对一个类的说明.架构.描述方法是: 往往分成头文件和实现的源文件,来实现代码的分离 然后,源文件中包含类的头文件... 头文件的包含问题: 类对应的实现文件cpp.main主 ...
- Educational Codeforces Round 56 (Rated for Div. 2)
涨rating啦.. 不过话说为什么有这么多数据结构题啊,难道是中国人出的? A - Dice Rolling 傻逼题,可以用一个三加一堆二或者用一堆二,那就直接.. #include<cstd ...
- Apache Kylin1.5.2.1之订单案例详细构建流程
转:http://blog.itpub.net/30089851/viewspace-2122586/ 一.Hive订单数据仓库构建1. 创建事实表并插入数据 DROP TABLE IF EXISTS ...
- stm32 iic读取mpu6050失败 改用串口
mpu6050使用iic一直失败.放弃治疗,使用串口... #include "led.h" #include "mpu6050.h" #include &qu ...