博客
关于我
Spring Boot--日志框架的学习
阅读量:267 次
发布时间:2019-02-28

本文共 7599 字,大约阅读时间需要 25 分钟。

版本:

  • Spring Boot 2.1.5.RELEASE

  • maven 3.2.5

  • jdk1.8

(想自学习编程的小伙伴请搜索,更多行业相关资讯更有行业相关免费视频教程。完全免费哦!)

1.我选用的日志框架:

  • 日志门面(抽象层): SLF4J
  • 日志实现: Logback

Spring Boot: 底层是Spring框架,Spring框架默认是JCL;

而Spring Boot选用 SLF4j和Logback

2. SLF4j使用

1) 如何在系统中使用SLF4j

开发的时候,日志记录方法的调用,不用改直接调用日志的实现类,而是调用日志抽象层里的方法;

  • 导入slf4j的jar和 logback的实现jar
import org.slf4j.Logger;    import org.slf4j.LoggerFactory;        public class HelloWorld {      public static void main(String[] args) {        Logger logger = LoggerFactory.getLogger(HelloWorld.class);        logger.info("Hello World");      }    }

SLF4j与其他日志框架结合示意图:

在这里插入图片描述
2) 遗留问题

虽然我使用的是(slf4j & logback),但是其他的比如Spring框架用的commons-logging日志框架, Hibernate用的是jboss-logging日志框架,等等,太乱了了,所以我们要 统一日志记录,即使别的框架也要和我一起统一使用slf4j进行输出;

官方给出的示意图:

在这里插入图片描述
逻辑:

  • 1.将系统其他的日志框架排除;
  • 2.用中间包来替换原有的日志框架(红色框起来的就是中间包);
  • 3.导入slf4j其他的实现

3. Spring Boot日志关系

其实是这个依赖的这个包:

org.springframework.boot
spring-boot-starter-logging
2.1.5.RELEASE
compile

pom文件下鼠标右键点击:

在这里插入图片描述
SpringBoot所有依赖关系图,我们只看logging相关的:
在这里插入图片描述

我用的是2.1.5版本的Spring Boot, 笔者在学习过程中发现我看的老师视频里跟我的版本不一样,

这是那位老师的版本:

在这里插入图片描述
很明显跟我不一样,不过Spring肯定对自己的底层进行了升级;

确切的说不是升级,而是剔除掉了jcl框架的转换,因为jcl框架最后更新日期是2014年,明显已经过时

但是基本推理的出来,slf4j的官网图确实是对SpringBoot1.x版本的示意,但是对我的2.x版本不符, 不过根据我的包名来看,他们的功能是差不多的,都是转成slf4j;

小总结:

  • 1.SpringBoot底层也是 slf4j+logback的方式j进行日志记录;
  • 2.SpringBoot也把其他日志都替换成了slf4j;
  • 3.中间替换包;

中间替换包图示:

在这里插入图片描述
4) 如果我们要引入其他的框架,一定要把这个框架默认日志依赖移除掉!

Spring框架默认的日志框架是: commons-logging;

但是Spring Boot引入spring核心jar包的时候去除了 日志jar包;

Spring Boot能自动适配所有的日志,而且底层使用 slf4j+logback的方式记录日志,引入其他框架的时候,只需要把这个框架依赖的日志排除掉

4. 日志使用

测试类:

import org.junit.Test;import org.junit.runner.RunWith;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.test.context.junit4.SpringRunner;@RunWith(SpringRunner.class)@SpringBootTestpublic class SpringBootLoggingApplicationTests {    // 日志记录器记录器    Logger logger = LoggerFactory.getLogger(getClass());    @Test    public void contextLoads() {        // 日志的级别        // 由低到高 trace < debug < info < warn < error        logger.trace("这是trace日志..");        logger.debug("这是debug调试日志..");        logger.info("这是info日志..");        logger.warn("这是warn日志...");        logger.error("这是error错误日志");    }}

运行输出结果:

2019-07-02 19:22:35.980  INFO 8404 --- [           main] c.c.s.SpringBootLoggingApplicationTests  : 这是info日志..2019-07-02 19:22:35.981  WARN 8404 --- [           main] c.c.s.SpringBootLoggingApplicationTests  : 这是warn日志...2019-07-02 19:22:35.981 ERROR 8404 --- [           main] c.c.s.SpringBootLoggingApplicationTests  : 这是error错误日志

也就是说 SpringBoot默认的日志级别是 info,所以只输出了info 和 比info级别大的日志;

打开我的yml配置文件:

logging:  level:    com.carson: trace

意思是把我 com.carson下的所有包都设置为 trace 日志级别

输出结果:

2019-07-02 19:29:17.406 TRACE 7076 --- [           main] c.c.s.SpringBootLoggingApplicationTests  : 这是trace日志..2019-07-02 19:29:17.407 DEBUG 7076 --- [           main] c.c.s.SpringBootLoggingApplicationTests  : 这是debug调试日志..2019-07-02 19:29:17.407  INFO 7076 --- [           main] c.c.s.SpringBootLoggingApplicationTests  : 这是info日志..2019-07-02 19:29:17.408  WARN 7076 --- [           main] c.c.s.SpringBootLoggingApplicationTests  : 这是warn日志...2019-07-02 19:29:17.408 ERROR 7076 --- [           main] c.c.s.SpringBootLoggingApplicationTests  : 这是error错误日志

4.1 配置文件详解:

logging.level.com.carson= trace# path: 只创建任意一个文件夹, SpringBoot会默认生成一个 spring.log 作为日志文件logging.path= F:/spring/log# file: 指定一个路径和文件把 日志输出到 指定文件里logging.file= F:/springboot.log# pattern.console: 控制台输出的日志格式logging.pattern.console= %d{yyyy‐MM‐dd} === [%thread] === %‐5level === %logger{50} ==== %msg%n#   pattern.file : 指定文件中日志的输出格式logging.pattern.file= %d{yyyy‐MM‐dd} === [%thread] === %‐5level === %logger{50} ==== %msg%n

4.2 指定配置

日志框架 文件命名
Logback logback-spring.xml, logback-spring.groovy, logback.xml, or logback.groovy
Log4j2 log4j2-spring.xml or log4j2.xml
JDK (Java Util Logging) logging.properties

以上来自SpringBoot的, 上面是他要求的命名,SpringBoot会读取的

  • logback-spring.xml :

    <?xml version="1.0" encoding="UTF-8"?> %d{yyyy-MM-dd HH:mm:ss.SSS} ----> [%thread] ---> %-5level %logger{50} - %msg%n %d{yyyy-MM-dd HH:mm:ss.SSS} ==== [%thread] ==== %-5level %logger{50} - %msg%n
    ${LOG_HOME}/${appName}.log
    ${LOG_HOME}/${appName}-%d{yyyy-MM-dd}-%i.log
    365
    100MB
    %d{yyyy-MM-dd HH:mm:ss.SSS} [ %thread ] - [ %-5level ] [ %logger{50} : %line ] - %msg%n

把上面配置复制一份,放到项目的 resources 里面,或者自定义配置,命名规范的区别:

  • logback.xml: 直接被日志框架识别了

  • 但是如果你以 logback-spring.xml 命名(推荐): 日志框架不直接加载日志的配置项了,由SpringBoot解析日志你就可以使用SpringBoot的一个高级功能

也就是刚才的配置文件里的:

%d{yyyy-MM-dd HH:mm:ss.SSS} ----> [%thread] ---> %-5level %logger{50} - %msg%n
%d{yyyy-MM-dd HH:mm:ss.SSS} ==== [%thread] ==== %-5level %logger{50} - %msg%n

你可以在你的 yml或者properties里配置一条:

spring.profiles.active= prod

来设置运行环境

4.3 使用 log4j

其实SpringBoot官方为我们做了一些帮助:

Name Description Pom
spring-boot-starter-jetty Starter for using Jetty as the embedded servlet container. An alternative to spring-boot-starter-tomcat
spring-boot-starter-log4j2 Starter for using Log4j2 for logging. An alternative to spring-boot-starter-logging
spring-boot-starter-logging Starter for logging using Logback. Default logging starter
spring-boot-starter-reactor-netty Starter for using Reactor Netty as the embedded reactive HTTP server.
spring-boot-starter-tomcat Starter for using Tomcat as the embedded servlet container. Default servlet container starter used by spring-boot-starter-web
spring-boot-starter-undertow Starter for using Undertow as the embedded servlet container. An alternative to spring-boot-starter-tomcat

想使用哪个日志框架就直接导入哪个包就好了, 比如我想使用 log4j2 我先把默认的 spring-boot-starter-logging 排除掉 , 排除方法如下:

在这里插入图片描述

  • 然后再pom文件里:

    org.springframework.boot
    spring-boot-starter-log4j2
    2.1.1.RELEASE

导入log4j2的包;

  • 然后在 resources 里 创建一个 log4j的配置文件,文件命名就以刚才说的:

内容:

### set log levels ###log4j.rootLogger = debug ,  stdout ,  D ,  E### 输出到控制台 ###log4j.appender.stdout = org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.Target = System.outlog4j.appender.stdout.layout = org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern =  %d{ABSOLUTE} ===== %5p %c{ 1 }:%L - %m%n#### 输出到日志文件 ####log4j.appender.D = org.apache.log4j.DailyRollingFileAppender#log4j.appender.D.File = logs/log.log#log4j.appender.D.Append = true#log4j.appender.D.Threshold = DEBUG ## 输出DEBUG级别以上的日志#log4j.appender.D.layout = org.apache.log4j.PatternLayout#log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n##### 保存异常信息到单独文件 ####log4j.appender.D = org.apache.log4j.DailyRollingFileAppender#log4j.appender.D.File = logs/error.log ## 异常日志文件名#log4j.appender.D.Append = true#log4j.appender.D.Threshold = ERROR ## 只输出ERROR级别以上的日志!!!#log4j.appender.D.layout = org.apache.log4j.PatternLayout#log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

也就是说,如果像引入其他日志框架,只要把以前的框架排除,然后再引入新框架就ok了

转载地址:http://ecdp.baihongyu.com/

你可能感兴趣的文章
mysql 如何给SQL添加索引
查看>>
mysql 字段区分大小写
查看>>
mysql 字段合并问题(group_concat)
查看>>
mysql 字段类型类型
查看>>
MySQL 字符串截取函数,字段截取,字符串截取
查看>>
MySQL 存储引擎
查看>>
mysql 存储过程 注入_mysql 视图 事务 存储过程 SQL注入
查看>>
MySQL 存储过程参数:in、out、inout
查看>>
mysql 存储过程每隔一段时间执行一次
查看>>
mysql 存在update不存在insert
查看>>
Mysql 学习总结(86)—— Mysql 的 JSON 数据类型正确使用姿势
查看>>
Mysql 学习总结(87)—— Mysql 执行计划(Explain)再总结
查看>>
Mysql 学习总结(88)—— Mysql 官方为什么不推荐用雪花 id 和 uuid 做 MySQL 主键
查看>>
Mysql 学习总结(89)—— Mysql 库表容量统计
查看>>
mysql 实现主从复制/主从同步
查看>>
mysql 审核_审核MySQL数据库上的登录
查看>>
mysql 导入 sql 文件时 ERROR 1046 (3D000) no database selected 错误的解决
查看>>
mysql 导入导出大文件
查看>>
MySQL 导出数据
查看>>
mysql 将null转代为0
查看>>