Spring Boot 日志

日志概述

        ⽇志对我们来说并不陌⽣,我们经常需要通过打印⽇志来发现和定位问题,或者根据⽇志来分析程序的运⾏过程.在Spring的学习中, 也经常需要根据控制台的⽇志来分析和定位问题.

打印日志

一:在程序中得到⽇志对象.

        通过⽇志⼯⼚ LoggerFactory 获取

        在程序中获取⽇志对象需要使⽤⽇志⼯⼚ LoggerFactory,如下代码所⽰:

private static Logger logger=LoggerFactory.getLogger(LoggerController.class);

        LoggerFactory.getLogger 方法需要传递⼀个参数,参数可以是 String 类型或者 类对象 标识这个⽇志的名称.这样可以更清晰的知道是哪个类输出的⽇志.当有问题时,可以更⽅便直观的定位到问题类,所以通常情况下,传入的参数都是当前类的类对象

        注意:Logger 对象是属于 org.slf4j 包下的, 不要导⼊错包.

        通过 lombok 提供的 @Slf4j 注解

        lombok 是一个程序猿很常用的工具类,它提供了 @Slf4j 注解帮助我们快速的创建⽇志对象,代码如下:

        首先,添加 lombok 依赖

<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional>
</dependency>

        通过 @Slf4j 注解快速获取⽇志对象

@Slf4j
public class LoggerController {public static void printLog() {log.error("打印error日志");}
}

        如上代码在类 LoggerController 前加 @Slf4j 注解,就相当于写了一段如下的代码到类 LoggerController 中,创建了名称为 log 的日志对象,直接使用即可

private final static Logger log=LoggerFactory.getLogger(LoggerController.class);

        

二:使⽤⽇志对象输出要打印的内容.

        日志打印的方法对应日志的级别,⽇志的级别从⾼到低依次为: FATAL、ERROR、WARN、INFO、DEBUG、TRACE (后面会详细介绍),打印日志的代码如下:

public static void printLog() {log.error("打印error日志");log.warn("打印warn日志");log.info("打印info日志");log.debug("打印debug日志");log.trace("打印trace日志");}

SLF4J 框架介绍

        SLF4J 就是其他日志框架的⻔⾯. SLF4J 可以理解为是提供⽇志服务的统⼀API接⼝, 但并不涉及到具体的⽇志逻辑实现.

        SLF4J是⻔⾯/外观模式的典型应⽤

门面/外观模式定义

        ⻔⾯模式(Facade Pattern)⼜称为外观模式, 提供了⼀个统⼀的接⼝, ⽤来访问⼦系统中的⼀群接⼝. 其主要特征是定义了⼀个⾼层接⼝,让⼦系统更容易使⽤.其中 SLF4J 就是日志框架中的高层接口

SLF4J 框架的意义

        SLF4J 框架既然不是具体实现功能的日志框架,那么它存在有什么意义呢?假设现在我们不引入 SLF4J 这个门面框架

        常⻅的实现功能的⽇志框架有 log4J , logback 等.如果⼀个项⽬已经使⽤了 log4j ,⽽你依赖的另⼀个类库,假如是 Apache Active MQ, 它依赖于另外⼀个⽇志框架logback, 那么你就需要把logback 也加载进去.此时项目中就存在了两个日志框架,这就会导致一些问题:

        1. 不同⽇志框架的API接和配置⽂件不同,如果多个⽇志框架共存,那么不得不维护多套配置⽂件(这个配置⽂件是指用户⾃定义的配置⽂件).

        2. 如果要更换⽇志框架,应⽤程序将不得不修改代码,并且修改过程中可能会存在⼀些代码冲突.

        现在我们引入 SLF4J 这个门面框架

        引⼊⻔⾯⽇志框架之后,应⽤程序和⽇志框架(框架的具体实现)之间有了统⼀的API接⼝(⻔⾯⽇志框架 实现),此时应⽤程序只需要维护⼀套⽇志⽂件配置,

        简单来说,SLF4J 门面框架作为实现功能的框架和应用程序的中间者,它管理了很多功能框架的 api 接口,为应用程序提供一个统一的 api 接口,降低了应用程序使用框架的难度,并且避免了应用程序和功能框架进行直接接触,起到了解耦的效果,当功能框架的内部实现发生变化,门面框架为应用程序提供的 api 不会发生变化,就不用修改应用程序的代码

⽇志格式的说明

        上图所示的是一段 Spring Boot 的日志,⽇志输出内容元素具体如下:

1. 时间⽇期:精确到毫秒

2. ⽇志级别:ERROR, WARN, INFO, DEBUG 或TRACE 

3. 进程ID 

4. 线程名

5. Logger(日志对象)名(通常是日志对象所在类的类名)

6. ⽇志内容

⽇志级别

        日志的级别从⾼到低依次为: FATAL、ERROR、WARN、INFO、DEBUG、TRACE,

        FATAL:致命信息,表⽰需要⽴即被处理的系统级错误.

        ERROR:错误信息,级别较⾼的错误⽇志信息,但仍然不影响系统的继续运⾏.

        WARN:警告信息,不影响使⽤,但需要注意的问题

        INFO:普通信息,⽤于记录应⽤程序正常运⾏时的⼀些信息,例如系统启动完成、请求处理完成等

        DEBUG:调试信息,需要调试时候的关键信息打印

        TRACE:追踪信息,⽐DEBUG更细粒度的信息事件(因为级别过低,除⾮有特殊⽤意,否则请使⽤DEBUG级别替代)

          级别越⾼,收到的消息越少

        要是细心我们会发现,在 ⽇志格式的说明 中,⽇志级别没有提到 FATAL(致命信息),这是因为 Spring 没有提供 FATAL 级别的日志打印,因为没有必要,如果发生 FATAL 级别的错误,程序马上就无法运行也就会被马上发现了

⽇志配置

配置⽇志级别

        该配置项设置了最低显示的日志级别,Spring 默认是 info ,所以我们要想看到 debug 级别的日志就需要设置最低显示的日志级别为 debug 

logging.level.root = debug

        其中 root 表示根目录,表示设置了所有类打印的日志级别,我们也可以单独设置某个类最低显示的日志级别,路径可以是相对路径也可以是绝对路径,一般写 java 文件下的路径

logging.level.com.example.springbootdemo=debug

⽇志持久化

        默认情况下日志都是输出在控制台上的,然⽽在线上环境中,我们需要把⽇志保存下来,以便出现问题之后追溯问题.把⽇志保存下来就叫持久化.

        ⽇志持久化有两种⽅式
        1. 配置⽇志⽂件名

logging.file.name=logger/springboot.log

        2. 配置⽇志的存储⽬录

        只配置存储目录的话,Spring 会为路径下的日志文件命名为 spring.log

logging.file.path=logger2

        注意:logging.file.name 和 logging.file.path 两个都配置的情况下, 只⽣效其⼀,以 logging.file.name 为准.

配置⽇志⽂件分割

        如果我们的⽇志都放在⼀个⽂件中,随着项⽬的运⾏,⽇志⽂件会越来越⼤,难以查阅,所以需要对⽇志⽂件进⾏分割

        配置⽇志分割后的⽂件名格式

logging.logback.rollingpolicy.file-name-pattern=${LOG_FILE}.%d{yyyy-MM-dd}.%i

        配置日志文件自动分割的最大内存,如下代码表示当日志文件达到 10MB 就自动分割

logging.logback.rollingpolicy.max-file-size=10MB

        分割以后的文件如下所示:

        文件名包含了日志的日期和编号

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/144749.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

embedding的综述

0【自然语言处理】Word2Vec 词向量模型详解 Python代码实战 1 一文读懂Embedding的概念&#xff0c;以及它和深度学习的关系 one-hot 变成地位稠密的向量&#xff0c;降维 什么是词嵌入&#xff1a;讲词汇表中的词或者词语映射成固定长度的向量。 具体过程&#xff1a; …

2023年第九届数维杯国际大学生数学建模挑战赛A题

2023年第九届数维杯国际大学生数学建模挑战赛正在火热进行&#xff0c;小云学长又在第一时间给大家带来最全最完整的思路代码解析&#xff01;&#xff01;&#xff01; A题思路解析如下&#xff1a; 完整版解题过程及代码&#xff0c;稍后继续给大家分享~ 更多题目完整解析点…

MIB 操作系统Lab: Xv6 and Unix utilities(1)boot xv6

从github中下载xv6代码 $ git clone git://g.csail.mit.edu/xv6-labs-2023 $ cd xv6-labs-2023 编译和运行xv6: $ make qemu 如果在终端输入ls命令&#xff0c;能看到输出。 大多数都是可以直接运行的命令。 xv6没有ps命令&#xff0c;但是可以输入ctrl-p可以看到进程的信…

fileread任意文件读取学习笔记

任意文件读取概述 一些网站的需求&#xff0c;可能会提供文件查看与下载的功能。如果对用户查看或下载的文件没有限制或者限制绕过&#xff0c;就可以查看或下载任意文件。这些文件可以是源代码文件&#xff0c;配置文件&#xff0c;敏感文件等等。 任意文件读取会造成&#x…

在docker下安装suiteCRM

安装方法&#xff1a; docker-hub来源&#xff1a;https://hub.docker.com/r/bitnami/suitecrm curl -sSL https://raw.githubusercontent.com/bitnami/containers/main/bitnami/suitecrm/docker-compose.yml > docker-compose.yml//然后可以在docker-compose.yml文件里修…

深度学习+opencv+python实现车道线检测 - 自动驾驶 计算机竞赛

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络3.1卷积层3.2 池化层3.3 激活函数&#xff1a;3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV56 数据集处理7 模型训练8 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &am…

HTML5学习系列之主结构

HTML5学习系列之主结构 前言HTML5主结构定义页眉定义导航定义主要区域定义文章块定义区块定义附栏定义页脚 具体使用总结 前言 学习记录 HTML5主结构 定义页眉 head表示页眉&#xff0c;用来表示标题栏&#xff0c;引导和导航作用的结构元素。 <header role"banner…

Java和JavaScript是一样的技术吗?

目录 一、Java 是什么 二、JavaScript 是什么 三、Java 和 JavaScript 的区别 一、Java 是什么 Java是一种广泛使用的计算机编程语言&#xff0c;最初由Sun Microsystems&#xff08;后被Oracle收购&#xff09;于1995年发布。Java是一种面向对象的语言&#xff0c;设计初衷…

qnx 工程目录创建工具 addvariant

文章目录 前言一、addvariant 是什么二、addvariant 使用实例1. variant names 参数说明2. 创建一个可执行文件工程3. 创建一个动态库工程 总结参考资料 前言 本文主要介绍如何在qnx 开发环境中创建工程目录及其相关的配置文件(common.mk, Makefile 文件等) 软件版本&#xff…

Java 注解

常见的注解 Override Overload Deprecated 过时 等..... /** *deprecated {link #方法名()}提示可替代方法 */ Deprecated 注解类:Annotion,给编译器进行执行 声明注解使用 interface,本质也是接口,也可以设置抽象方法,起到属性的作用 package java.lang.annotation…

1、LeetCode之两数之和

两数之和 给定一个整数数组 nums和一个目标值target&#xff0c;请你在该数组中找出和为目标值的那两个整数&#xff0c;并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是&#xff0c;你不能重复利用这个数组中同样的元素。 nums [2,7,11,15]target 9[0,1]枚…

mindspore mindyolo目标检测华为昇腾上推理使用、训练;华为OBS文件传输使用

参考&#xff1a; https://github.com/mindspore-lab/mindyolo 使用案例&#xff1a; https://github.com/mindspore-lab/mindyolo/blob/master/GETTING_STARTED.md 安装&#xff1a; pip install mindyolo特别注意opencv-python、opencv-python-headless版本问题&#xff0…

代码随想录算法训练营Day 53 || 1143.最长公共子序列、1035.不相交的线、53. 最大子序和

1143.最长公共子序列 力扣题目链接 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长公共子序列的长度。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些字符&#xff08;也可以不删除任何…

003.文件描述符、重定向

1、文件描述符 文件描述符是与输入和输出流相关联的整数。最广为人知的文件描述符是stdin、stdout和stderr。我们可以将某个文件描述符的内容重定向到另一个文件描述符中。 在编写脚本的时候会频繁用到标准输入&#xff08;stdin&#xff09;、标准输出&#xff08;stdout&am…

Visual Studio Code配置c/c++环境

Visual Studio Code配置c/c环境 1.创建项目目录2.vscode打开项目目录3.项目中添加文件4.文件内容5.配置编译器6.配置构建任务7.配置调试设置 1.创建项目目录 d:\>mkdir d:\c语言项目\test012.vscode打开项目目录 3.项目中添加文件 4.文件内容 #include <iostream> u…

网络编程TCP/UDP通信

1 网络通信概述 1.1 IP 和端口 所有的数据传输&#xff0c;都有三个要素 &#xff1a;源、目的、长度。 怎么表示源或者目的呢&#xff1f;请看图 所以&#xff0c;在网络传输中需要使用“IP 和端口”来表示源或目的。 1.2 网络传输中的 2 个对象&#xff1a;server 和 cl…

C语言--字符串详解(多角度分析,什么是字符串?字符串如何存储?字符串如何应用?字符串常用的库函数有哪些?)

目录 一、前言 &#x1f4a6;什么是字符串 &#x1f4a6;字符串如何存储&#xff1f; 二、字符串常量和字符数组 &#x1f4a6;字符串常量 ✨什么是字符串常量&#xff1f; ✨字符串常量与指针 &#x1f4a6;字符数组 ✨字符数组的应用 &#x1f4a6;字符串常量与字符数组的…

k8s-集群升级 2

在每个集群节点都安装部署cir-docker 配置cri-docker 升级master节点 导入镜像到本地并将其上传到仓库 修改节点套接字 升级kubelet 注&#xff1a;先腾空后进行升级&#xff0c;顺序不能搞反&#xff0c;否则会导致严重问题 配置kubelet使用cri-docker 解除节点保护 升级wor…

水库大坝安全监测预警系统的重要作用

水库大坝建造在地质构造复杂、岩土特性不均匀的地基上&#xff0c;在各种荷载的作用和自然因素的影响下&#xff0c;其工作性态和安全状况随时都在变化。如果出现异常&#xff0c;又不被及时发现&#xff0c;其后果不堪设想。全天候实时监测&#xff0c;实时掌握水库水位、雨情…

postman连接数据库

参考&#xff1a;https://blog.csdn.net/qq_45572452/article/details/126620210 1、安装node.js 2、配置环境变量 3、安装xmysql连接数据库cmd窗口输入"npm install -g xmysql"后回车cmd窗口输入"xmysql"后回车,验证xmysql是否安装成功(下图代表安装成功)…