Spring Boot 项目三种打印日志的方法详解。Logger,log,logger 解读。

news2025/5/26 4:04:18

目录

一. 打印日志的常见三种方法?

1.1 手动创建 Logger 对象(基于SLF4J API)

1.2 使用 Lombok 插件的 @Slf4j 注解

1.3 使用 Spring 的 Log 接口(使用频率较低)

二. 常见的 Logger,logger,log是有什么关系吗?

三. 日志的级别和推荐级别


一. 打印日志的常见三种方法?

1.1 手动创建 Logger 对象(基于SLF4J API)

第一种方法就是手动创建 logger 日志对象,直接通过 LoggerFactory 日志工厂创建即可,使用 Logger 类型来接收,这里实例对象就叫 "logger"。

SLF4J 是日志门面(Facade),它提供统一的日志接口,不直接实现日志功能。

核心类org.slf4j.Logger 是 SLF4J 的核心接口,通过 LoggerFactory.getLogger() 创建实例。

打印日志也可以单个或多个参数,具体实例如下图,

注意每个"{}"对应一个参数即可,并且参数顺序要对的上。

import com.markerhub.entity.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.time.LocalDateTime;

public class MyClass {
    // 通过 LoggerFactory 日志工厂创建日志对象
    private static final Logger logger = LoggerFactory.getLogger(MyClass.class);
    public static void main(String[] args) {
        // 用法一:单个参数 logger 日志打印
        String message = "abcde";
        logger.info("这是手动创建的 logger 对象打出的日志:打印单个参数{}", message);

        // 用法二:多个参数 logger 日志打印
        int number = 100;
        String message2 = "abcdefg";
        long time = 1000000000000000000L;
        logger.info("这是手动创建的 logger 对象打出的日志:打印多个参数{},{},{}", number, message2, time);

        // 用法三:对象参数 logger 日志打印
        User user1 = new User();
        user1.setUsername("zhangsna");
        user1.setPassword("123456");
        user1.setCreated(LocalDateTime.now());
        user1.setEmail("123456@qq.com");
        user1.setStatus(1);
        logger.info("这是手动创建的 logger 对象打出的日志:打印对象参数{}", user1);
        logger.debug("debug 日志");
        logger.error("error 日志");
    }
}

运行程序,如下控制台打印所示,可以看出 info 就是普通的日志,debug 是调试日志,error 是错误日志。

这里之所以有颜色区分是因为小编使用了插件,插件名称:"Grep Console",有需要的小伙伴可以搜索看下使用教程。

1.2 使用 Lombok 插件的 @Slf4j 注解

第二种方法最简单,直接使用 @Slf4j 注解,但需要注意IDEA中需要安装了 Lombok 插件并且你的 spring boot 项目中引用了 lombok 依赖。

@Slf4j 是lombok插件提供的一个注解,用于自动生成 SLF4J 的 Logger 实例,减少样板代码。其底层还是通过第一种方式去新建的 logger 对象。

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

如下代码

注解在类的头上添加 @Slf4j 注解即可,然后就可以在本类的任意位置直接显式调用 log 对象,不需要再自行创建,非常方便。

import com.markerhub.entity.User;
import lombok.extern.slf4j.Slf4j;

import java.time.LocalDateTime;

@Slf4j
public class MyClass {
    public static void main(String[] args) {
        // 用法一:单个参数 logger 日志打印
        String message = "abcde";
        log.info("这是 @Slf4j 注解的 log 对象打出的日志:打印单个参数{}", message);

        // 用法二:多个参数 logger 日志打印
        int number = 100;
        String message2 = "abcdefg";
        long time = 1000000000000000000L;
        log.info("这是 @Slf4j 注解的 log 对象打出的日志:打印多个参数{},{},{}", number, message2, time);

        // 用法三:对象参数 logger 日志打印
        User user1 = new User();
        user1.setUsername("zhangsna");
        user1.setPassword("123456");
        user1.setCreated(LocalDateTime.now());
        user1.setEmail("123456@qq.com");
        user1.setStatus(1);
        log.info("这是 @Slf4j 注解的 log 对象打出的日志:打印对象参数{}", user1);
        log.debug("debug 日志");
        log.error("error 日志");
    }
}

运行程序,如下图,和上面的 logger 对象效果是完全一样的。 

1.3 使用 Spring 的 Log 接口(使用频率较低)

如下代码所示,Spring 自身提供了 Log接口也可以创建日志对象。

import com.markerhub.entity.User;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.time.LocalDateTime;


public class MyClass {
    private static final Log logger = LogFactory.getLog(MyClass.class);
    public static void main(String[] args) {
        // 用法一:单个参数 logger 日志打印
        String message = "abcde";
        logger.info("这是 @Slf4j 注解的 log 对象打出的日志:打印单个参数{}",message);

        // 用法二:多个参数 logger 日志打印
        int number = 100;
        String message2 = "abcdefg";
        long time = 1000000000000000000L;
        logger.info("这是 @Slf4j 注解的 log 对象打出的日志:打印多个参数{},{},{}", number, message2, time);

        // 用法三:对象参数 logger 日志打印
        User user1 = new User();
        user1.setUsername("zhangsna");
        user1.setPassword("123456");
        user1.setCreated(LocalDateTime.now());
        user1.setEmail("123456@qq.com");
        user1.setStatus(1);
        logger.info("这是 @Slf4j 注解的 log 对象打出的日志:打印对象参数{}", user1);
        logger.debug("debug 日志");
        logger.error("error 日志");
    }
}

但是, Spring 提供的 logger 对象,无法像前两种一样输出参数值,这一点其实是不太友好的,不过 Spring 提供的这种日志输出方式基本也没人使用,同学们作为了解即可,主要还是前两种用的比较多。

二. 常见的 Logger,logger,log是有什么关系吗?

(1)Logger 是SLF4J提供的日志接口,用于创建日志对象(如 LoggerFactory.getLogger())。需要手动实例化。

(2)log 是通过 @Slf4j 注解生成的变量名,本质还是一个 Logger 实例。

(3)logger ,没有特殊含义,只是采用SLF4J提供的日志接口创建对象时,常常见对象命名为 logger 而已。

三. 日志的级别和推荐级别

如以下表格所示,日志的详细程度由高到低。一般情况下,日志输出的详细,越耗费系统性能,所以不建议将日志输出特别详细,适中即可,大部分都是选择 INFO 级别,也推荐大家尽量选择 INFO 或 DEBUG

级别严重性适用场景生产环境建议开发环境建议
TRACE最低详细追踪程序执行流程关闭按需开启
DEBUG调试代码逻辑和变量状态关闭开启
INFO监控应用运行状态和关键操作开启开启
WARN较高潜在问题,不影响程序运行开启开启
ERROR功能错误,需人工干预开启开启
FATAL最高致命错误,程序无法继续运行开启开启

日志级别的设置,基本在配置文件中设置的,方式如下 

# 设置全局日志级别
logging.level.root=info

# 设置特定包的日志级别
logging.level.com.example.myapp=debug

# 自定义日志输出格式和文件路径
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
logging.file.name=app.log

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

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

相关文章

[react]Next.js之自适应布局和高清屏幕适配解决方案

序言 阅读前首先了解即将要用到的两个包的作用 1.postcss-pxtorem 自动将 CSS 中的 px 单位转换为 rem 单位按照设计稿尺寸直接写 px 值&#xff0c;由插件自动计算 rem 值 2.amfe-flexible 动态设置根元素的 font-size&#xff08;即 1rem 的值&#xff09;根据设备屏幕宽度和…

STM32H503CB升级BootLoader

首先&#xff0c;使用SWD接口&#xff0c;ST-LINK连接电脑和板子。 安装SetupSTM32CubeProgrammer_win64 版本2.19。 以下是接线和软件操作截图。

在Apple Silicon上部署Spark-TTS:四大核心库的技术魔法解析!!!

在Apple Silicon上部署Spark-TTS&#xff1a;四大核心库的技术魔法解析 &#x1f680; &#xff08;M2芯片实测&#xff5c;Python 3.12.9PyTorch 2.6.0全流程解析&#xff09; 一、核心库功能全景图 &#x1f50d; 在Spark-TTS的部署过程中&#xff0c;pip install numpy li…

VMWare 16 PRO 安装 Rocky8 并部署 MySQL8

VMWare 16 PRO 安装 Rocky8 并部署 MySQL8 一.Rocky OS 下载1.官网二.配置 Rocky1.创建新的虚拟机2.稍后安装系统3.选择系统模板4.设置名字和位置5.设置大小6.自定义硬件设置核心、运存和系统镜像7.完成三.启动安装1.上下键直接选择安装2.回车安装3.设置分区(默认即可)和 roo…

cursor如何回退一键回退多个文件的修改

当我们使用 Cursor 写代码时&#xff0c;起初可能操作得很顺利&#xff0c;但某次更改或许会让代码变得面目全非。这时候如果没有使用 Git 该怎么办呢&#xff1f;别担心&#xff0c;Cursor 已经为我们考虑到了。 具体的操作如下&#xff1a; 当我们要取消某次操作时&#xf…

基于RV1126开发板的口罩识别算法开发

1. 口罩识别简介 口罩识别是一种基于深度学习的判断人员有没有戴口罩的分类算法&#xff0c;能广泛的用于安防、生产安全等多种场景。本算法先基于人脸检测和人脸标准化获取的标准人脸&#xff0c;然后输入到口罩识别分类算法进行识别。 本人脸检测算法在数据集表现如下所示&am…

PyCharm显示主菜单和工具栏

显示主菜单 新版 PyCharm 是不显示主菜单的&#xff0c;要想显示主菜单和工具栏&#xff0c;则通过 “视图” → “外观” &#xff0c;勾选 “在单独的工具栏中显示主菜单” 和 “工具栏” 即可。 设置工具栏 此时工具栏里并没有什么工具&#xff0c;因此我们需要自定义工具…

Java工程行业管理软件源码 - 全面的项目管理工具 - 工程项目模块与功能一览

工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离构建工程项目管理系统 项目背景 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性&#xff0c;公司对内部工程管理的提升提…

Redis 高可用集群搭建与优化实践

在分布式系统中,缓存技术用于提升性能和响应速度。 Redis 作为一款高性能的键值存储系统,广泛应用于缓存、消息队列和会话管理等场景。随着业务规模的扩大,单机 Redis 的性能和可用性逐渐无法满足需求。 因此,搭建高可用的 Redis 集群可以解决这一问题。我将详细介绍 Red…

【AI大模型】基于阿里百炼大模型进行调用

目录 一、认识阿里云百炼 模型广场 创建自己的模型 二、AI扩图示例 1、开头服务、设置秘钥 2、选择HTTP方式调用流程 3、创建任务请求示例 4、发送http请求提交任务 5、查看任务进度的流程设计 6、后端查看任务进度代码 三、总结 大家好&#xff0c;我是jstart千语…

【神经网络结构的组成】深入理解 转置卷积与转置卷积核

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;《深度学习理论直觉三十讲》_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 …

MyBatis-plus笔记 (上)

简介 [MyBatis-Plus]&#xff08;简称 MP&#xff09;是一个 [MyBatis]的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 mybatis-plus总结&#xff1a; 注意&#xff1a;mybatis-puls仅局限于单表操作。 自动生成单表的C…

大模型微调数据集怎么搞?基于easydataset实现文档转换问答对json数据集!

微调的难点之一在与数据集。本文介绍一种将文档转换为问答数据集的方法&#xff0c;超级快&#xff01; 上图左侧是我的原文档&#xff0c;右侧是我基于文档生成的数据集。 原理是通过将文档片段发送给ollama本地模型&#xff0c;然后本地模型生成有关问题&#xff0c;并基于文…

opencv 灰度实验

opencv 灰度实验 1. 最大值法2. 平均值法3. 加权均值法4(直接读取灰度图)cv2.IMREAD_GRAYSCALE5内置将原图转换为灰度图cv2.cvtColor()6 两个极端的灰度值 灰度图与彩色图最大的不同就是&#xff1a;彩色图是由R、G、B三个通道组成&#xff0c;而灰度图只有一个通道&#xff0c…

高性能内存kv数据库Redis(续)

目录 四.主从同步与对象模型 1.Redis 淘汰策略 2.Redis 如何做到 持久化 2.1 redis为什么要实现持久化 2.2fork进程的写时复制机制 2.3大Key的影响 2.4redis做持久化的方式 2.5 aof 2.6 rdb 2.7 redis 持久化方式的优缺点 3.redis里面的高可用体现在哪里&#xff1f; 3.1r…

【指纹浏览器系列-chromium编译】

本文提供了一步一步的指导来帮助读者在Windows环境下成功编译Chromium浏览器。涵盖了系统需求、开发环境搭建、代码下载及构建等关键步骤。 官方编译文档&#xff1a;https://github.com/chromium/chromium/blob/main/docs/windows_build_instructions.md 一、系统要求 一台…

Docker华为云创建私人镜像仓库

Docker华为云创建私人镜像仓库 在华为云官网的 产品 中搜索 容器镜像服务 &#xff1a; 或者在其他页面的搜索栏中搜索 容器镜像服务 &#xff1a; 进入到页面后&#xff0c;点击 创建组织 &#xff08;华为云的镜像仓库称为组织&#xff09;&#xff1a; 设置组织名字后&…

Ubuntu 22.04安装MySQL : Qwen2.5 模型对话数据收集与微调教程

在Ubuntu 22.04安装MySQL的教程请点击下方链接进行参考: 点击这里获取MySQL安装教程 今天将为大家带来如何微调Qwen2.5模型并连接数据库进行对话的教程。快跟着小编一起试试吧~ ​ 1 大模型 Qwen2.5 微调步骤 1.1 从 github 仓库 克隆项目 克隆存储库:#拉取代码 git clo…

关于 JDK 中的 jce.jar 的详解,以及与之功能类似的主流加解密工具的详细对比分析

以下是关于 JDK 中的 jce.jar 的详细解析&#xff0c;涵盖其作用、内容、历史背景及使用注意事项&#xff1a; 一、jce.jar 的核心作用 jce.jar 是 Java Cryptography Extension (JCE) 的核心实现库&#xff0c;提供 加密算法支持&#xff0c;包括&#xff1a; 对称加密&…

React 更新state中的对象

更新 state 中的对象 state 中可以保存任意类型的 JavaScript 值&#xff0c;包括对象。但是&#xff0c;你不应该直接修改存放在 React state 中的对象。相反&#xff0c;当你想要更新一个对象时&#xff0c;你需要创建一个新的对象&#xff08;或者将其拷贝一份&#xff09;…