springboot系列springboot日志框架

未读代码      2022-04-29     480

关键词:

注意:本 Spring Boot 系列文章基于 Spring Boot 版本 v2.1.1.RELEASE 进行学习分析,版本不同可能会有细微差别。

前言

技术图片

Spring 框架选择使用了 JCL 作为默认日志输出。而 Spring Boot 默认选择了 SLF4J 结合 LogBack。那我们在项目中该使用哪种日志框架呢?在对于不同的第三方 jar 使用了不同的日志框架的时候,我们该怎么处理呢?

1. 日志框架介绍

日志对于应用程序的重要性不言而喻,不管是记录运行情况还是追踪线上问题,都离不开对日志的分析,在 Java 领域里存在着多种日志框架,如 JUL, Log4j, Log4j2, Commons Loggin, Slf4j, Logback 等。关于 Log4j, Log4j2 和 Slf4j 直接的故事这里不做介绍,有兴趣可以自行百度。

2. SLF4 的使用

在开发的时候不应该直接使用日志实现类,应该使用日志的抽象层。具体参考 SLF4J 官方
下图是 SLF4J 结合各种日志框架的官方示例,从图中可以清晰的看出 SLF4J API 永远作为日志的门面,直接应用与应用程序中。
技术图片

同时 SLF4 官方给出了简单示例。

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 的 jar 和 日志框架的实现 jar. 由于每一个日志的实现框架都有自己的配置文件,所以在使用 SLF4 之后,配置文件还是要使用实现日志框架的配置文件。

3. 统一日志框架的使用

一般情况下,在项目中存在着各种不同的第三方 jar ,且它们的日志选择也可能不尽相同,显然这样是不利于我们使用的,那么如果我们想为项目设置统一的日志框架该怎么办呢?

SLF4J 官方,也给了我们参考的例子。

技术图片

从图中我们得到一种统一日志框架使用的方式,可以使用一种和要替换的日志框架类完全一样的 jar 进行替换,这样不至于原来的第三方 jar 报错,而这个替换的 jar 其实使用了 SLF4J API. 这样项目中的日志就都可以通过 SLF4J API 结合自己选择的框架进行日志输出。
统一日志框架使用步骤归纳如下

  1. 排除系统中的其他日志框架。
  2. 使用中间包替换要替换的日志框架。
  3. 导入我们选择的 SLF4J 实现。

4. Spring Boot 的日志关系

4.1. 排除其他日志框架

根据上面总结的要统一日志框架的使用,第一步要排除其他的日志框架,在 Spring Boot 的 Maven 依赖里可以清楚的看到 Spring Boot 排除了其他日志框架。

技术图片
我们自行排除依赖时也只需要按照图中的方式就好了。

4.2. 统一框架引入替换包

其实 Spring Boot 也是使用了 SLF4J+logback 的日志框架组合,查看 Spring Boot 项目的 Maven 依赖关系可以看到 Spring Boot 的核心启动器 spring-boot-starter 引入了 spring-boot-starter-logging.

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-logging</artifactId>
      <version>2.1.1.RELEASE</version>
      <scope>compile</scope>
    </dependency>

而 spring-boot-starter-logging 的 Maven 依赖主要引入了 logback-classic (包含了日志框架 Logback 的实现),log4j-to-slf4j (在 log4j 日志框架作者开发此框架的时候还没有想到使用日志抽象层进行开发,因此出现了 log4j 向 slf4j 转换的工具),jul-to-slf4j ( Java 自带的日志框架转换为 slf4j).

  <dependencies>
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>1.2.3</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-to-slf4j</artifactId>
      <version>2.11.1</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>jul-to-slf4j</artifactId>
      <version>1.7.25</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>

从上面的分析,Spring Boot 对日志框架的使用已经是清晰明了了,我们使用 IDEA 工具查看 Maven 依赖关系,可以清晰的看到日志框架的引用。如果没有 IDEA 工具,也可以使用 Maven 命令查看依赖关系。

mvn dependency:tree
技术图片

由此可见,Spring Boot 可以自动的适配日志框架,而且底层使用 SLF4 + LogBack 记录日志,如果我们自行引入其他框架,需要排除其日志框架。

5. Spring Boot 的日志使用

5.1. 日志级别和格式

从上面的分析,发现 Spring Boot 默认已经使用了 SLF4J + LogBack . 所以我们在不进行任何额外操作的情况下就可以使用 SLF4J + Logback 进行日志输出。
编写 Java 测试类进行测试。

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;

/**
 * <p>
 * 测试日志输出,
 * SLF4J 日志级别从小到大trace,debug,info,warn,error
 *
 * @Author niujinpeng
 * @Date 2018/12/11 21:12
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class LogbackTest {
    
    Logger logger = LoggerFactory.getLogger(getClass());

    @Test
    public void testLog() {
        logger.trace("Trace 日志...");
        logger.debug("Debug 日志...");
        logger.info("Info 日志...");
        logger.warn("Warn 日志...");
        logger.error("Error 日志...");
    }
}

已知日志级别从小到大为 trace < debug < info < warn < error . 运行得到输出如下。由此可见 Spring Boot 默认日志级别为 INFO.

2018-12-11 23:02:58.028 [main] INFO  n.c.boot.LogbackTest - Info 日志...
2018-12-11 23:02:58.029 [main] WARN  n.c.boot.LogbackTest - Warn 日志...
2018-12-11 23:02:58.029 [main] ERROR n.c.boot.LogbackTest - Error 日志...

从上面的日志结合 Logback 日志格式可以知道 Spring Boot 默认日志格式是。

%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
# %d{yyyy-MM-dd HH:mm:ss.SSS} 时间
# %thread 线程名称
# %-5level 日志级别从左显示5个字符宽度
# %logger{50} 类名
# %msg%n 日志信息加换行

至于为什么 Spring Boot 的默认日志输出格式是这样?

技术图片
我们可以在 Spring Boot 的源码里找到答案。

5.2 自定义日志输出

可以直接在配置文件编写日志相关配置。

# 日志配置
# 指定具体包的日志级别
logging.level.net.codingme=debug
# 控制台和日志文件输出格式
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
# 日志文件大小
logging.file.max-size=10MB
# 保留的日志时间
logging.file.max-history=10
# 日志输出路径,默认文件spring.log
logging.path=systemlog
#logging.file=log.log

关于日志的输出路径,可以使用 logging.file 或者 logging.path 进行定义,两者存在关系如下表。

logging.file logging.path 例子 描述
(没有) (没有) 仅控制台记录。
具体文件 (没有) my.log 写入指定的日志文件,名称可以是精确位置或相对于当前目录。
(没有) 具体目录 /var/log 写入spring.log指定的目录,名称可以是精确位置或相对于当前目录。

6. 替换日志框架

因为 Log4j 日志框架已经年久失修,原作者都觉得写的不好,所以下面演示替换日志框架为 Log4j2 的方式。根据官网我们 Log4j2 与 logging 需要二选一,因此修改 pom如下。

        <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>

文章代码已经上传到 GitHub Spring Boot 日志系统

<完>
本文原发于个人博客:https://www.codingme.net 转载请注明出处
技术图片










springboot2系列教程|配置日志

前言如题,今天介绍springboot默认日志的配置。默认日志Logback默认情况下,SpringBoot用Logback来记录日志,并用INFO级别输出到控制台。如果你在平常项目中用过SpringBoot,你应该已经注意到很多INFO级别的日志了。默认日志长这样:20... 查看详情

springboot系列一:默认日志logback配置解析

前言今天来介绍下SpringBoot如何配置日志logback,我刚学习的时候,是带着下面几个问题来查资料的,你呢如何引入日志?日志输出格式以及输出方式如何配置?代码中如何使用?正文SpringBoot在所有内部日志中使用CommonsLogging,但是... 查看详情

springboot系列——如何集成log4j2

上篇《SpringBoot系列——日志配置》介绍了SpringBoot如何进行日志配置,日志系统用的是SpringBoot默认的LogBack。事实上,除了使用默认的LogBack,SpringBoot还可以使用Log4j、Log42等作为自己的日志系统。今天就那Log4j2来举例,说明SpringBo... 查看详情

springboot2系列教程(二十)|springboot是如何实现日志的?

...后台留言,反正我也不会听。前言休息日闲着无聊看了下SpringBoot中的日志实现,把我的理解跟大家说下。门面模式说到日志框架不得不说门面模式。门面模式,其核心为外部与一个子系统的通信必须通过一个统一的外观对象进... 查看详情

springboot系列

https://my.oschina.net/xiedeshou?tab=newest&catalogId=5936801SpringBoot|第零章:前言SpringBoot|第一章:第一个SpringBoot应用SpringBoot|第二章:lombok介绍及简单使用SpringBoot|第三章:springboot配置详解SpringBoot|第四章:日志配置SpringBoot|第 查看详情

剑指架构师系列-springboot的logback日志记录

  SpringBoot集成了Logback日志系统。Logback的核心对象主要有3个:Logger、Appender、Layout 1、Logback Logger:日志的记录器 主要用于存放日志对象,也可以定义日志类型、级别。级别:ERROR、WARE、INFO、DEBUG和TRACE。没有FATA... 查看详情

springboot系列——日志配置

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

springboot配置全系列

基础配置maven的profile方式springboot的profile使用方式开发模式配置配置tomcat配置web相关配置日志配置JSP配置数据源集成配置集成druid集成mybatis集成Freemarker集成redis集成dubbo集成zookeeper集成rocketmq 查看详情

java日志框架--springboot中的日志使用(代码片段)

1.SpringBoot中的日志使用springboot框架在企业中的使用越来越普遍,springboot日志也是开发中常用的日志系统。springboot默认就是使用SLF4J作为日志门面,logback作为日志实现来记录日志。不懂日志框课和日志门面的请查看这篇... 查看详情

springboot应用系列4--springboot2整合log4j2

一、背景1.log4j2传承于log4j和logback,它是目前性能最好的日志处理工具,有关它们的性能对比请看:2.除了性能好之外,log4j2有这么几个重要的新features:(1)自动热重载配置文件,而且重新加载期间不会丢失日志请求。logback也可以... 查看详情

重学springboot系列之日志框架与全局日志管理(代码片段)

重学SpringBoot系列之日志框架与全局日志管理日志框架的体系结构五花八门的日志工具包日志框架日志门面日志门面存在的意义日志框架选型日志级别常见术语概念解析logback日志框架配置application配置文件实现日志配置日志格式... 查看详情

springboot如何配置日志logback?(代码片段)

原文链接:http://tengj.top/2017/04/05/springboot7/本文标题:SpringBoot干货系列:(七)默认日志logback配置解析文章作者:嘟嘟MD发布时间:2017-04-05,17:01:12最后更新:2019-08-18,10:59:33原始链接:http://tengj.top/2017/04/05 查看详情

springboot应用系列5--springboot2整合logback

上一篇我们梳理了SpringBoot2整合log4j2的配置过程,其中讲到了SpringBoot2原装适配logback,并且在非异步环境下logback和log4j2的性能差别不大,所以对于那些日志量不算太高的项目来说,选择logback更简单方便。1.pom.xmlpom.xml不需要添加... 查看详情

springboot.06.springboot日志管理

SpringBoot.06.SpringBoot日志管理SpringBoot日志介绍概念日志的级别日志的分类SpringBoot日志基本使用1.新建Module2.项目配置3.配置日志SpringBoot日志切割1.application.yml2.application-dev.yml3.logback-dev.xml4.测试SpringBoot日志介绍概念在SpringBoot框架中... 查看详情

springboot.06.springboot日志管理(代码片段)

SpringBoot.06.SpringBoot日志管理SpringBoot日志介绍概念日志的级别日志的分类SpringBoot日志基本使用1.新建Module2.项目配置3.配置日志SpringBoot日志切割1.application.yml2.application-dev.yml3.logback-dev.xml4.测试SpringBoot日志介绍概念在SpringBoot框架中... 查看详情

springboot.06.springboot日志管理(代码片段)

SpringBoot.06.SpringBoot日志管理SpringBoot日志介绍概念日志的级别日志的分类SpringBoot日志基本使用1.新建Module2.项目配置3.配置日志SpringBoot日志切割1.application.yml2.application-dev.yml3.logback-dev.xml4.测试SpringBoot日志介绍概念在SpringBoot框架中... 查看详情

springboot----springboot配置日志文件

今天介绍一下SpringBoot配置日志文件SpringBoot在所有的内部日志中使用CommonsLogging,但是默认配置也提供了对常用日志的支持,如JavaUtilLogging,Log4J,Log4J2和Logback。但是每种Logger都可以通过配置使用控制台或者文件输出日志内容。... 查看详情

springboot框架学习4-springboot核心

本节主要:1:springboot为我们提供的starterpom都有哪些2:怎么添加xml配置文件3:日志相关本文是《凯哥陪你学系列-框架学习之springboot框架学习》中第四篇springboot框架学习4-springboot核心(3)声明:本文系凯哥Java(www.kaigejava.com)原创,... 查看详情