当前位置: 首页 > news >正文

Spring Boot 日志

目录

1.概述

2.切换日志实现

3.使用

3.1.日志级别

3.3.日志离线

3.4.详细定制


1.概述

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

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

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

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

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和LoggerFactoryLogger logger= LoggerFactory.getLogger(MyRunner.class);@Overridepublic void run(String... args) throws Exception {//日志级别:error<warn<info<debug<tracelogger.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会生效。

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>
 

相关文章:

Spring Boot 日志

目录 1.概述 2.切换日志实现 3.使用 3.1.日志级别 3.3.日志离线 3.4.详细定制 1.概述 由一些历史原因&#xff0c;JAVA领域存在有很多日志框架&#xff0c;如Log4j、Logback、log4j2。 log4j是Java日志框架的元老&#xff0c;在log4j被Apache Foundation收入门下之后&a…...

好用的研发管理看板工具有哪些?10款主流看板管理软件盘点

10大企业看板工具软件&#xff1a;1.软件开发项目看板 PingCode&#xff1b;2.通用看板软件 Worktile&#xff1b;3.开源看板软件 Wekan&#xff1b;4.免费看板软件 Trello&#xff1b;5.个人和小团队的看板软件 Todoist &#xff1b;6.开源免费看 Kanboard&#xff1b;7.面向个…...

【软考系统架构设计师】2022下案例分析历年真题

【软考系统架构设计师】2022下案例分析历年真题 【软考系统架构设计师】2022下案例分析历年真题【软考系统架构设计师】2022下案例分析历年真题2022下案例分析历年真题第一题&#xff08;25分&#xff09;2022下案例分析历年真题第二题&#xff08;25分&#xff09;2022下案例分…...

Java skill - @JsonAlias 和 @JsonProperty

Java skill - JsonAlias 和 JsonPropertyJava skill系列目录&#xff1a;JsonAlias 和 JsonProperty使用 JsonProperty 的麻烦场景&#xff1a;使用 JsonAlias 应对麻烦场景&#xff1a;Java skill系列目录&#xff1a; 【Java skill - 统计耗时用StopWatch】 【Java skill - …...

【实际开发18】- 静态 3

目录 1. 调试与评估 2. 单元测试的管理 1. 单元测试的文档 3. 系统集成的模式与方法 1. 集成测试前的准备 2. 集成测试的模式 3. 大棒集成方法 ( Big-bang Integration) 4. 自顶向下和自底向上集成方法 1. 自顶向下法 ( Top-down Integration ) 2. 自底向上法 ( Bott…...

【swagger2】开发api文档

文章目录一、swagger2 简介背景Open API ???swagger2的作用swagger2常用工具组件&#xff1a;二、Springfox三、springBoot使用swagger2&#xff08;简单示例&#xff09;四、Swagger-UI使用五、配置文件1、配置类&#xff1a;给docket上下文配置api描述信息2、配置类&#…...

Github 上如何提交 pull request

什么是复刻&#xff08;forking&#xff09;? 我们可以通过复刻操作将喜爱的仓库保存自己的Github账户中&#xff0c;以便独立地对其进行操作。 通过复刻&#xff0c;我们可以得到包含完整版本历史的目标仓库的实例&#xff0c;之后可以对复刻得到的仓库进行任意操作而不会影响…...

Redis面试知识

概述 Redis 是速度非常快的非关系型(NoSQL)内存键值数据库,可以存储键和五种不同类型的值之间的映射。 键的类型只能为字符串,值支持五种数据类型:字符串、列表、集合、散列表、有序集合。 Redis 支持很多特性,例如将内存中的数据持久化到硬盘中,使用复制来扩展读性能…...

Spring面试重点(四)——Spring事务

Spring事务 事务的方式 spring中使用事务有两种方式&#xff0c;一种是编程式事务&#xff0c;一种是声明式事务。编程式事务推荐使用TransactionTemplate&#xff0c;实现TransactionCallback接口&#xff0c;需要编码实现&#xff1b;声明式事务只需要在函数增加注解Transa…...

♡ — MySQL 存储引擎

MySQL 存储引擎架构 MySQL 存储引擎采用的是插件式架构&#xff0c;支持多种存储引擎&#xff0c;我们甚至可以为不同的数据库设置不同的存储引擎以适应不同场景的需要&#xff1b;存储引擎是基于表的&#xff0c;而不是数据库。 MyISAM 和 InnoDB 的区别 MySQL 5.5 之前&am…...

大数据技术架构(组件)34——Spark:Spark SQL--Optimize

2.2.3、Optimize2.2.3.1、SQL3.3.1.1、RB1、Join选择在Hadoop中&#xff0c;MR使用DistributedCache来实现mapJoin。即将小文件存放到DistributedCache中&#xff0c;然后分发到各个Task上&#xff0c;并加载到内存中&#xff0c;类似于Map结构&#xff0c;然后借助于Mapper的迭…...

Zookeeper实现分布式锁

文章目录ZK节点类型watch监听机制Zookeeper实现分布式锁锁原理创建锁的过程释放锁的过程ZK锁的种类代码实现Zookeeper是一个开源的分布式协调服务&#xff0c;是一个典型的分布式数据一致性解决方案。 分布式应用程序可以基于Zookeeper实现诸如数据发布/订阅&#xff0c;负载均…...

MFC 添加重新启动管理器支持

重启管理器是添加到 Visual Studio for Windows Vista 或更高版本操作系统的功能 如果发生意外关闭或重启&#xff0c;重新启动管理器将为你的应用程序添加支持。 重新启动管理器的行为取决于应用程序的类型。 如果你的应用程序是文档编辑器&#xff0c;则重新启动管理器让应用…...

一文带你深刻的进入Python,并且了解Python的优缺点

最近几年Python被吹的神乎其神&#xff0c;很多同学都不清楚Python到底能干什么&#xff1f;就盲目去学习Python,今天我就Python的应用领域来简单盘点一下&#xff0c;让想学习Python 的同学找对方向不迷茫。 2. Python 的特点 这里就谈谈自己的看法&#xff0c;首先 Python是…...

别具一格,原创唯美浪漫情人节表白专辑,(复制就可用)(html5,css3,svg)表白爱心代码(4)

别具一格,独此一家&#xff0c;原创唯美浪漫情人节表白专辑 不一样的惊喜哦~&#xff01;&#xff08;html5,css3,svg)表白爱心代码&#xff08;复制就可用&#xff09;&#xff08;4&#xff09; 目录 款式四&#xff1a;时光的记忆款 1、拷贝完整源代码 2、更新时光盒所…...

编译原理—翻译方案、属性栈代码

系列文章戳这里&#x1f447; 什么是上下文无关文法、最左推导和最右推导如何判断二义文法及消除文法二义性何时需要消除左递归什么是句柄、什么是自上而下、自下而上分析什么是LL(1)、LR(0)、LR(1)文法、LR分析表LR(0)、SLR(1)、LR(1)、LALR(1)文法之间的关系编译原理第三章习…...

链表

一、从尾到头打印链表题目&#xff1a;输入一个链表&#xff0c;按链表从尾到头的顺序返回一个ArrayList。解题思路&#xff1a;使用栈作为中转&#xff0c;可以实现倒置打印classSolution { public:vector<int> printListFromTailToHead(ListNode* head){//使用栈完成中…...

CSS 样式优先级

CSS 样式优先级决定了最终呈现在浏览器中的样式是哪一组样式&#xff0c;在多组样式中有冲突时&#xff0c;最终呈现在浏览器中的样式是具有最高优先级的样式。 CSS 样式优先级顺序如下&#xff1a; 内联样式 > 内部样式 > 外部样式 !important > 内联样式 > ID…...

SpingMVC获取请求参数

通过ServletAPI获取请求参数将HttpServletRequest作为控制器方法的形参&#xff0c;此时HttpServletRequest类型的参数表示封装了当前请求的请求报文的对象。html<form th:action"{/param/servletAPI}" method"post">用户名&#xff1a;<input ty…...

微搭使用笔记(二)微搭低代码平台介绍及基础使用

概述 官网地址&#xff1a; 官网 官方文档&#xff1a; 官方文档 FAQ: FAQ 腾讯云微搭低代码是一个高性能的低代码开发平台&#xff0c;用户可通过拖拽式开发&#xff0c;可视化配置构建 PC Web、H5 和小程序应用。支持打通企业内部数据&#xff0c;轻松实现企业微信管理、工…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...