Spring Boot 日志

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 1.概述由一些历史原因,JAVA领域存在有很多日志框架,如Log4j、Logback、log4j2。log4j是Java日志框架的元老,在log4j被Apache Foundation收入门下之后,由于理念不合,log4j的作者Ceki离开并开发了slf4j和logback。这几个框架都很热门,这就造成了不同系统、不同开源框架使用的日志框架都不同。

1.概述

由一些历史原因,JAVA领域存在有很多日志框架,如Log4j、Logback、log4j2。

log4j是Java日志框架的元老,在log4j被Apache Foundation收入门下之后,由于理念不合,log4j的作者Ceki离开并开发了slf4j和logback。这几个框架都很热门,这就造成了不同系统、不同开源框架使用的日志框架都不同。


因为不同日志框架的日志输出格式、API均不同,所以当系统中存在多种日志框架被混用就会出现冲突,最直接的现象就是——日志格式不统一,这对项目的日志排查来说是极不方便的,甚至有时候还会因为日志框架的冲突而报错。因此同一个项目中统一日志框架是十分有必要的,但是如果只是单纯的保留一个日志框架,移除其余日志框架,由于各日志系统API的不同很可能系统根本就起不来,所以需要一个中间层来进行适配,从而解决这个问题。


这个中间层就是——日志门面。日志门面使用门面模式屏蔽掉了不同日志实现之间的不同,对外暴露统一的API。

2a4a7d6e392049e2b89c386d2be5f2d7.png

2.切换日志实现

SpringBoot默认使用SLF4J作为日志门面,LogBack作为日志实现来记录日志。

这里我们不去细究SLF4J是怎么去完成适配的,只需要知道SpringBoot自带了日志门面,使用日志门面来输出日志,当想要切换日志实现的时候,排掉LogBack,引入新的实现即可。


以切换为log4j2为例:


<dependency>

   <groupId>org.springframework.boot</groupId>

   <artifactId>spring-boot-starter-web</artifactId>

   <!--1. 排除掉依赖 ,以此排除掉logback+slf4j引用-->

   <exclusions>

        <exclusion>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-logging</artifactId>

         </exclusion>

    </exclusions>

</dependency>

<!--2. 添加log4j2依赖 -->

<dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-log4j2</artifactId>

</dependency>

3.使用

3.1.日志级别

配置:

可以指定全局日志等级,也可以以方法为粒度指定日志等级,支持*作为通配符

#全局日志等级

logging.level.root=trace

#单都指定日志等级

logging.level.com.eryi.controller.MyRunner.*=trace

代码:

package com.eryi.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
@Component
public class MyRunner implements CommandLineRunner {
    //特别注意,要使用slf4j的Logger和LoggerFactory
    Logger logger= LoggerFactory.getLogger(MyRunner.class);
    @Override
    public void run(String... args) throws Exception {
        //日志级别:error<warn<info<debug<trace
        logger.trace("trace......");
        logger.debug("debug......");
        //Spring Boot默认使用info级别
        logger.info("info......");
        logger.warn("warn......");
        logger.error("error......");
    }
}

3.3.日志离线

不指定路径,日志文件只会在控制台输出,不会离线为本地文件。

使用path可以指定路径,文件名默认使用springlog.log

使用file可以指定路径+文件名,不指定路径会默认离现在工程目录下。

file和path是两个冲突设置,如果同时配置,只有file会生效。

2f17fe0573ad4cafb433f10d4823a257.png

3.4.详细定制

spring boot的配置文件中的日志配置项只能进行粗粒度的配置,想对日志进行细粒度的定制需要在类路径下(一般是在resources下)编写xml配置文件。命名规则为XXX-spring.xml,XXX是日志框架的名称。

以下为一个logback-spring.xml的模板:

<?xml version="1.0" encoding="UTF-8"?>

<configuration>

   <!--

    configuration中有appender、logger、root三个节点

     appender:表示的是定义了一种文件的输出格式  就有点类似于 变量进行了定义 但是没有来得及使用

     logger:这个就表示的是我们定义了这个变量在哪一个局部能够使用

             我们的日志原本是针对于整个工程的配置  但是你可以定义在哪一个包里面  使用什么日志输出格式 以及 输出到哪些地方

     root:相当于定义的是整个项目 的日志输出级别  以及 输出日志到哪些地方

   -->


   <!--

      定义了日志的输出  ConsoleAppender  这个类表示的是输出到控制台

   -->

   <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">

       <!--设置输出到控制台的编码和格式


       %d{yyyy-MM-dd-HH:mm:ss.SSS}:这个表示的是时间的引用

       %level:当前输出的日志级别

       [%thread]:表示当前是哪一个线程

       %class:这个表示的是这个日志是在哪一个类中打印出来的

       %line:这个表示的是打印这个日志是在这个类的 哪一行打印出来的

       %msg:这个表示的是打印的消息是什么

       %n:这个表示的是换行

       -->

       <encoder>

           <pattern>%d{yyyy-MM-dd-HH:mm:ss.SSS}------->%level--------->[%thread]-%class:%line----->%msg%n</pattern>

           <!--设置了打印到控制台的编码-->

           <charset>UTF-8</charset>

       </encoder>

   </appender>



   <!--

      定义日志输出到文件的格式

      name:是可以随便写的   FileAppender:输出到文件

   -->

   <appender name="file" class="ch.qos.logback.core.FileAppender">


       <!--这个表示的是日志文件输出的路径  这个默认表示的是输出到当前项目的根目录下 叫做file.log-->

       <file>log/file.log</file>

       <!--这个表示的是 每一次写日志的时候是在上一次的基础上进行追加-->

       <append>true</append>

       <encoder>

           <!--定义了输出的格式-->

           <pattern>%d{yyyy-MM-dd-HH:mm:ss.SSS} %level    [%thread]-%class:%line>>%msg%n</pattern>

           <charset>UTF-8</charset>

       </encoder>

       <!--

           prudent=true:表示的是日志的写入是线程安全的、但是线程安全会降低效率  一般默认设置为false

       -->

       <prudent>false</prudent>

   </appender>


   <!--

      RollingFileAppender:表示的是日志要滚动输出


   -->

   <appender name="timeFile" class="ch.qos.logback.core.rolling.RollingFileAppender">

       <!--

           rollingPolicy滚动的策略

           TimeBasedRollingPolicy:最常用的一个、根据时间进行滚动 当达到一定的时间的时候、就会自动开辟一个新的日志文件

           FixedWindowRollingPolicy:根据固定窗口的算法重命名文件的滚动策略

           TriggeringPolicy:根据当前活动文件的大小来来确定是否滚动

       -->

       <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

           <!--日志文件的名字  引用了当前的日期-->

           <fileNamePattern>log/logFile%d{yyyy-MM-dd}.log</fileNamePattern>

           <!--生成这个日志文件 保留多少天-->

           <maxHistory>30</maxHistory>

       </rollingPolicy>

       <!--编码的格式-->

       <encoder>

           <pattern>%d{yyyy-MM-dd-HH:mm:ss.SSS} %level    [%thread]-%class:%line>>%msg%n</pattern>

           <charset>UTF-8</charset>

       </encoder>

   </appender>


   <!--

      RollingFileAppender:这个是滚动输出

      FixedWindowRollingPolicy:根据活动窗口算法的大小来滚动输出


   -->

   <appender name="fixedFile" class="ch.qos.logback.core.rolling.RollingFileAppender">

       <!--日志的名字-->

       <file>log/fixedFile.log</file>

       <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">

           <fileNamePattern>log/fixedFile%i.log.zip</fileNamePattern>

           <!--最少生成一个日志文件-->

           <minIndex>1</minIndex>

           <!--最多生成3个日志文件-->

           <maxIndex>3</maxIndex>

       </rollingPolicy>


       <!--根据文件的大小来设置滚动输出的-->

       <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">

           <!--日志文件的最大的大小-->

           <maxFileSize>5MB</maxFileSize>

       </triggeringPolicy>

       <!--日志输出的格式-->

       <encoder>

           <pattern>%d{yyyy-MM-dd-HH:mm:ss.SSS} %level    [%thread]-%class:%line>>%msg%n

           </pattern>

           <charset>UTF-8</charset>

       </encoder>

   </appender>



   <!--文件输出-->

   <appender name="filter" class="ch.qos.logback.core.FileAppender">

       <file>log/filter.log</file>

       <append>true</append>

       <!--

           LevelFilter:的意思是添加了一个日志级别的过滤器

           如果日志的级别等于配置的级别。那么则执行onMatch里面的配置

           否则执行 onMismatch中的内容

       -->

       <filter class="ch.qos.logback.classic.filter.LevelFilter">

           <level>INFO</level>

           <!--

                ACCEPT:当前的日志会立即被执行不经过其他的过滤器了

                DENY:日志立即被抛弃、也不再经过其他的过滤器了

                NEUTRAL:下一个过滤器将继续执行、如果是最后一个过滤器的话那么就会被执行

           -->

           <onMatch>ACCEPT</onMatch>

           <onMismatch>DENY</onMismatch>

       </filter>

       <!--临界值过滤器:如果你输出的日志级别 是低于下面定义的这个级别的话那么 就会被过滤掉-->

       <filter class="ch.qos.logback.classic.filter.ThresholdFilter">

           <level>INFO</level>

       </filter>


       <encoder>

           <pattern>%d{yyyy-MM-dd-HH:mm:ss.SSS} %level    [%thread]-%class:%line>>%msg%n

           </pattern>

           <charset>UTF-8</charset>

       </encoder>

       <prudent>false</prudent>

   </appender>


   <!--设置局部的 这个日志的输出级别 或者 是 在哪里输出日志-->


               <!--测试的路径-->

   <!--    <logger name="com.project.controller" level="trace" addtivity="false">

           <appender-ref ref="stdout" />

           <appender-ref ref="file" />

           <appender-ref ref="timeFile" />

       </logger>-->


   <!--这个是给全局设置一个日志级别  所有的都适用

       appender-ref :全局的日志我们要打印到哪些地方


   -->

   <root level="error">

<!--        打印到控制台-->

       <appender-ref ref="stdout" />

<!--        打印到file文件里-->

       <appender-ref ref="file" />

       <appender-ref ref="timeFile" />

       <!--<appender-ref ref="fixedFile" />-->

       <!--<appender-ref ref="filter" />-->

   </root>


</configuration>

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
4月前
|
Java 中间件
SpringBoot入门(6)- 添加Logback日志
SpringBoot入门(6)- 添加Logback日志
142 5
|
2月前
|
开发框架 运维 监控
Spring Boot中的日志框架选择
在Spring Boot开发中,日志管理至关重要。常见的日志框架有Logback、Log4j2、Java Util Logging和Slf4j。选择合适的日志框架需考虑性能、灵活性、社区支持及集成配置。本文以Logback为例,演示了如何记录不同级别的日志消息,并强调合理配置日志框架对提升系统可靠性和开发效率的重要性。
|
2月前
|
存储 安全 Java
Spring Boot 3 集成Spring AOP实现系统日志记录
本文介绍了如何在Spring Boot 3中集成Spring AOP实现系统日志记录功能。通过定义`SysLog`注解和配置相应的AOP切面,可以在方法执行前后自动记录日志信息,包括操作的开始时间、结束时间、请求参数、返回结果、异常信息等,并将这些信息保存到数据库中。此外,还使用了`ThreadLocal`变量来存储每个线程独立的日志数据,确保线程安全。文中还展示了项目实战中的部分代码片段,以及基于Spring Boot 3 + Vue 3构建的快速开发框架的简介与内置功能列表。此框架结合了当前主流技术栈,提供了用户管理、权限控制、接口文档自动生成等多项实用特性。
93 8
|
4月前
|
Java 中间件
SpringBoot入门(6)- 添加Logback日志
SpringBoot入门(6)- 添加Logback日志
80 1
|
4月前
|
JSON Java 数据库
SpringBoot项目使用AOP及自定义注解保存操作日志
SpringBoot项目使用AOP及自定义注解保存操作日志
84 1
|
5月前
|
Java Maven Spring
SpringBoot日志整合
SpringBoot日志整合
49 2
|
5月前
|
数据采集 监控 Java
SpringBoot日志全方位超详细手把手教程,零基础可学习 日志如何配置及SLF4J的使用......
本文是关于SpringBoot日志的详细教程,涵盖日志的定义、用途、SLF4J框架的使用、日志级别、持久化、文件分割及格式配置等内容。
321 0
SpringBoot日志全方位超详细手把手教程,零基础可学习 日志如何配置及SLF4J的使用......
|
5月前
|
SQL XML 监控
SpringBoot框架日志详解
本文详细介绍了日志系统的重要性及其在不同环境下的配置方法。日志用于记录系统运行时的问题,确保服务的可靠性。文章解释了各种日志级别(如 info、warn、error 等)的作用,并介绍了常用的日志框架如 SLF4J 和 Logback。此外,还说明了如何在 SpringBoot 中配置日志输出路径及日志级别,包括控制台输出与文件输出的具体设置方法。通过这些配置,开发者能够更好地管理和调试应用程序。
|
6月前
|
运维 NoSQL Java
SpringBoot接入轻量级分布式日志框架GrayLog技术分享
在当今的软件开发环境中,日志管理扮演着至关重要的角色,尤其是在微服务架构下,分布式日志的统一收集、分析和展示成为了开发者和运维人员必须面对的问题。GrayLog作为一个轻量级的分布式日志框架,以其简洁、高效和易部署的特性,逐渐受到广大开发者的青睐。本文将详细介绍如何在SpringBoot项目中接入GrayLog,以实现日志的集中管理和分析。
413 1
|
7月前
|
人工智能 Java Spring
Spring框架下,如何让你的日志管理像‘AI’一样智能,提升开发效率的秘密武器!
【8月更文挑战第31天】日志管理在软件开发中至关重要,不仅能帮助开发者追踪问题和调试程序,还是系统监控和运维的重要工具。在Spring框架下,通过合理配置Logback等日志框架,可大幅提升日志管理效率。本文将介绍如何引入日志框架、配置日志级别、在代码中使用Logger,以及利用ELK等工具进行日志聚合和分析,帮助你构建高效、可靠的日志管理系统,为开发和运维提供支持。
127 0