日志系统分为两部分,一部分是日志抽象层,一部分是日志实现层。常见的日志抽象层JCL,SLF4J,JBoss-Logging,日志实现层有logback,log4j,log4j2,JUL。日志抽象层的功能是提供一个统一的调用入口,而真正得日志实现功能有日志实现层来做。如果需要使用日志功能,则需要选取一个日志抽象层和一个日志实现层。

slf4j 是一个日志抽象层框架,他需要和其他日志实现框架配合才能实现日志功能,如下图所示,如果单独使用slf4j则会输出空,slf4j和logback配合使用的话,还需导入logback相关的jar包,如果和其他的日志实现框架配合使用的话,不仅需要导入日志实现框架还需要导入一个转换层,如log4j 的slf4-log4j12.jar。不管使用哪种日志实现框架,日志的配置文件还是需要使用日志实现框架的配置文件,这个文件是被日志框架直接读取的。

1.SLF4J的使用

2.如何统一使用slf4j 记录日志

由于系统导入很多依赖,每个依赖可能已经在依赖其他的的日志框架(如spring 依赖 Commons logging),如何让他们统一使用slf4j记录日志呢?sjf4j 的官方文档 中https://www.slf4j.org/legacy.html 有介绍

如上图,具体做法是:

(1)将框架已经依赖的其他日志框架先排除掉

(2)导入中间的适配层jar包(jul-to-slf4j.jar等等)

(3)再导入需要的日志实现jar包。

3.spring boot 的日志实现

Spring boot 底层的日志实现是通过slf4j + logback实现的。下图是spring boot 的依赖关系,spring-boot-starter-logging是spring boot 的日志启动器。它又分别依赖了logback-classic 和 log4j-to-slf4j,jul-to-slf4j ,这两个jar包的作用就是上面讲的,讲其他的日志框架转换成slf4j,作为一个中间适配层来使用的。

spring boot 会为我们自动适配成slf4j + logback 的日志记录框架,如果需要引入其他额外的jar包,怎么能让新引入的jar也使用上slf4j+logback 来记录日志呢?

只需要做一件就够了:如果新引入的jar包中含有其他日志框架,我们只要将这个日志框架从jar包中排除即可。spring boot 已经导入相应的适配层的包,会自动顶替被排除包的功能。例如 spring 排除commons-logging 包

    <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>

4.spring boot 的日志使用

spring boot 已经默认配置好了日志

Logger logger = LoggerFactory.getLogger(xxx.class);

获取日志记录器,使用loger.info 、logger.debug 等方法记录日志,如果需要调整默认的日志配置,则在全局配置文件中修改配置即可,spring boot 默认的root级别为info 级别,输出info及以上级别的日志信息。同时也可以日志的输出格式。

        %d表示日期时间,
%thread表示线程名,
%-5level:级别从左显示5个字符宽度
%logger{50} 表示logger名字最长50个字符,否则按照句点分割。
%msg:日志消息,
%n是换行符

logging.file 和 logging.path 如果都不指定,则只会在控制台输出,不会在文件输出。

logging.file 可以指定生成日志文件的名称或者日志文件的名称及位置,如果不指定位置只指定了名称,在会在当前的项目路径下生成日志文件。

logging.path 指定日志文件的位置,默认使用spring.log 作为日志文件的名称。

# 在控制台输出的日志的格式
logging.pattern.console=%d{yyyy-MM-dd} [%thread] %-5level %logger{50} - %msg%n
# 指定文件中日志输出的格式
logging.pattern.file=%d{yyyy-MM-dd} === [%thread] === %-5level === %logger{50} ==== %msg%n

#指定日志文件大小,超过指定的值,则新建一个,默认10M

logging.file.max-size=20M

#要保存的存档日志文件的最大数量

logging.file.max-history=10

5.使用自定义的配置文件

官方文档的26.5章节开始介绍了使用自定义配置文件的办法。使用方法是在类路径上放日志框架的配置文件即可

官方推荐使用带-spring 的配置文件,带-sping 后缀的和不带后缀的区别是:带后缀的后被spring 识别,可以使用一些spring 的高级特性,不带后缀的只会被日志框架实现。

官方文档的26.6.1 和26.6.2介绍了两种告诫特性,分别是profile 和 Environment ,规定了再特殊条件下才可生效。

6.更改spring boot 默认的日志框架

如果不想使用spring boot 默认的日志框架,想切换成其他的日志实现框架。

1.从spring-boot-starter 中排除logback 的jar包

2.引入其他日志实现框架的jar包

切换成slf4j+log4j的方式:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<artifactId>logback-classic</artifactId>
<groupId>ch.qos.logback</groupId>
</exclusion>
<exclusion>
<artifactId>log4j-over-slf4j</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency> <dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</dependency>

切换成slf4j+log4j2 的方式:

 <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<artifactId>spring-boot-starter-logging</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

spring boot-7.日志系统的更多相关文章

  1. Spring Boot系列——日志配置

    日志,通常不会在需求阶段作为一个功能单独提出来,也不会在产品方案中看到它的细节.但是,这丝毫不影响它在任何一个系统中的重要的地位. 为了保证服务的高可用,发现问题一定要即使,解决问题一定要迅速,所以生 ...

  2. Spring Boot 之日志记录

    Spring Boot 之日志记录 Spring Boot 支持集成 Java 世界主流的日志库. 如果对于 Java 日志库不熟悉,可以参考:细说 Java 主流日志工具库 关键词: log4j, ...

  3. 【spring boot】8.spring boot的日志框架logback使用

    在继续上一篇的Debug调试之后,把spring boot的日志框架使用情况逐步蚕食. 参考:http://tengj.top/2017/04/05/springbo 开篇之前,贴上完整applica ...

  4. Spring Boot默认日志logback配置解析

    前言 今天来介绍下Spring Boot如何配置日志logback,我刚学习的时候,是带着下面几个问题来查资料的,你呢 如何引入日志? 日志输出格式以及输出方式如何配置? 代码中如何使用? 正文 Sp ...

  5. Spring Boot与日志

    目录 1.日志框架 2.市面上的日志框架 2.1 下表行间无任何对应关系 2.2 日志门面:slf4j 2.3 日志实现:logback 2.4 Spring Boot怎么做的呢? 3.slf4j的使 ...

  6. Spring Boot 自定义日志详解

    本节内容基于 Spring Boot 2.0. 你所需具备的基础 什么是 Spring Boot? Spring Boot 核心配置文件详解 Spring Boot 开启的 2 种方式 Spring ...

  7. Spring Boot Log4j2 日志学习

    简介 Java 中比较常用的日志工具类,有: Log4j. SLF4j. Commons-logging(简称jcl). Logback. Log4j2(Log4j 升级版). Jdk Logging ...

  8. [日志] spring boot + logback 日志输出配置

    一.输出日志到控制台 springboot有很多starter(参考starter)方便快速构建项目依赖组件,logback是springboot默认的日志组件,启动即可看到打印在控制台输出的info ...

  9. Spring Boot Log 日志使用教程

    我们编写任何 Spring Boot 程序,可能绕不开的就是 log 日志框架(组件). 在大多数程序员眼中日志是用来定位问题的.这很重要. 本项目源码下载 注意本项目提供的源码已在后期重新编写,有部 ...

  10. Spring Boot的日志配置

    一.配置logback日志 Spring Boot默认使用logback打印日志 需要增加依赖 <groupId>org.springframework.boot</groupId& ...

随机推荐

  1. Rust学习-阶段1学习总结

    学习Rust已经两周了,基本上是断断续续的在学,或者是在上下班坐公交时,或者是在ODC没事做时.现在已经学习了Rust程序设计语言的前5章,是时候做一个总结了.关于数据类型或者if else这种内容我 ...

  2. Redis常见面试问题及答案

    大量key在同一时间过期,注意什么? 如果过期时间过于集中,会导致Redis可能会出现短暂的卡顿现象.严重的话会出现缓存雪崩,一般需要在时间上加一个随机值, 使用过期时间分散一些. Redis分布式锁 ...

  3. Git 删除本地保存的账号和密码

    使用git在本地拉过一次代码时候git会自动将用户名密码保存到本地. 导致想用别的用户名和密码拉代码时没有权限,这时需要删除或者修改git在本地保存的账户名和密码. 具体办法如下: 1.控制面板--& ...

  4. 关系型数据库(四),引擎MyISAM和InnoDB

    目录 1.MyISAM和InnoDB关于锁方面的区别是什么 2.MYSQL的两个常用存储引擎 3.MyISAM应用场景 4.InnoDB适合场景 四.引擎MyISAM和InnoDB 1.MyISAM和 ...

  5. pycharm代码无法自动补全

    今天写代码时,突然pycharm代码无法自动补全了,经查找后,解决方案如下: 将python 和 spelling 选中即可 后续:当刚打开pycharm时,出现下面的进度条,代码补全功能完好:但是当 ...

  6. Java回调

    最近在看Spring的JdbcTemplate,有碰到很多的回调场景,在这里做一个笔记. 示例: 公司的经理出差时打电话给你让你帮他处理件事情,但不能一直通着电话,于是他让你办好事情后打电话告诉他一声 ...

  7. 解决zbx的web界面zabbix服务器端运行中 显示为不(启动命令)

    zabbix装完,发现server和agent服务都起来了,端口监听了,但是web界面zabbix服务器端运行中为 不 解决: 打开浏览器,到zabbix的setup.php界面 一般输入 ip/za ...

  8. 190707Python-Redis

    一.Redis的简单使用 Redis操作模式 # Author:Li Dongfei import redis r = redis.Redis(host='192.168.56.7', port=63 ...

  9. 【Spark机器学习速成宝典】模型篇08支持向量机【SVM】(Python版)

    目录 什么是支持向量机(SVM) 线性可分数据集的分类 线性可分数据集的分类(对偶形式) 线性近似可分数据集的分类 线性近似可分数据集的分类(对偶形式) 非线性数据集的分类 SMO算法 合页损失函数 ...

  10. sql总结-----基本查询

    创建一个测试表,插入一些测试数据: Create Table Cstable (Id Int,Age Int,Name Varchar2(8),Address Varchar2(20)); Inser ...