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>

相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
目录
相关文章
|
1月前
|
Prometheus 监控 Java
日志收集和Spring 微服务监控的最佳实践
在微服务架构中,日志记录与监控对系统稳定性、问题排查和性能优化至关重要。本文介绍了在 Spring 微服务中实现高效日志记录与监控的最佳实践,涵盖日志级别选择、结构化日志、集中记录、服务ID跟踪、上下文信息添加、日志轮转,以及使用 Spring Boot Actuator、Micrometer、Prometheus、Grafana、ELK 堆栈等工具进行监控与可视化。通过这些方法,可提升系统的可观测性与运维效率。
119 1
日志收集和Spring 微服务监控的最佳实践
|
23天前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
232 4
|
7月前
|
存储 Java 文件存储
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— logback.xml 配置文件解析
本文解析了 `logback.xml` 配置文件的详细内容,包括日志输出格式、存储路径、控制台输出及日志级别等关键配置。通过定义 `LOG_PATTERN` 和 `FILE_PATH`,设置日志格式与存储路径;利用 `&lt;appender&gt;` 节点配置控制台和文件输出,支持日志滚动策略(如文件大小限制和保存时长);最后通过 `&lt;logger&gt;` 和 `&lt;root&gt;` 定义日志级别与输出方式。此配置适用于精细化管理日志输出,满足不同场景需求。
1683 1
|
3月前
|
机器学习/深度学习 XML Java
【spring boot logback】日志logback格式解析
在 Spring Boot 中,Logback 是默认的日志框架,它支持灵活的日志格式配置。通过配置 logback.xml 文件,可以定义日志的输出格式、日志级别、日志文件路径等。
515 5
|
7月前
|
Java 微服务 Spring
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录——使用Logger在项目中打印日志
本文介绍了如何在项目中使用Logger打印日志。通过SLF4J和Logback,可设置不同日志级别(如DEBUG、INFO、WARN、ERROR)并支持占位符输出动态信息。示例代码展示了日志在控制器中的应用,说明了日志配置对问题排查的重要性。附课程源码下载链接供实践参考。
787 0
|
7月前
|
SQL Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— application.yml 中对日志的配置
在 Spring Boot 项目中,`application.yml` 文件用于配置日志。通过 `logging.config` 指定日志配置文件(如 `logback.xml`),实现日志详细设置。`logging.level` 可定义包的日志输出级别,例如将 `com.itcodai.course03.dao` 包设为 `trace` 级别,便于开发时查看 SQL 操作。日志级别从高到低为 ERROR、WARN、INFO、DEBUG,生产环境建议调整为较高级别以减少日志量。本课程采用 yml 格式,因其层次清晰,但需注意格式要求。
643 0
|
5月前
|
监控 容灾 算法
阿里云 SLS 多云日志接入最佳实践:链路、成本与高可用性优化
本文探讨了如何高效、经济且可靠地将海外应用与基础设施日志统一采集至阿里云日志服务(SLS),解决全球化业务扩展中的关键挑战。重点介绍了高性能日志采集Agent(iLogtail/LoongCollector)在海外场景的应用,推荐使用LoongCollector以获得更优的稳定性和网络容错能力。同时分析了多种网络接入方案,包括公网直连、全球加速优化、阿里云内网及专线/CEN/VPN接入等,并提供了成本优化策略和多目标发送配置指导,帮助企业构建稳定、低成本、高可用的全球日志系统。
635 54
|
11月前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
3015 31
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
10月前
|
监控 安全 Apache
什么是Apache日志?为什么Apache日志分析很重要?
Apache是全球广泛使用的Web服务器软件,支持超过30%的活跃网站。它通过接收和处理HTTP请求,与后端服务器通信,返回响应并记录日志,确保网页请求的快速准确处理。Apache日志分为访问日志和错误日志,对提升用户体验、保障安全及优化性能至关重要。EventLog Analyzer等工具可有效管理和分析这些日志,增强Web服务的安全性和可靠性。
265 9