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

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

目录

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

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

相关文章:

  • 深入解析 sklearn 中的多种特征编码方式:功能、适用场景与选择建议
  • React 在组件间共享状态
  • [Godot] C#人物移动抖动解决方案
  • 机器学习 | 通俗理解Q-Learning、Sarsa和Sarsa(λ)
  • Python----机器学习(逻辑回归与二分类问题)
  • Access Token 和 Refresh Token 的双令牌机制,维持登陆状态
  • 通道注意力机制|Channel Attention Neural Network
  • ESP8266/32作为AVR编程器(ISP programmer)的使用介绍
  • JVM:JVM与Java体系结构
  • 小白如何从0学习php
  • 一款轻量级的PHP地址发布页面源码
  • HarmonyOS-ArkUI V2状态-PersistenceV2:持久化存储UI状态
  • ubuntu启动 Google Chrome 时默认使用中文界面,设置一个永久的启动方式
  • 架构设计系列
  • 在Java使用rest Client操作ES
  • 软件设计模式
  • vue+vite 减缓首屏加载压力和性能优化
  • dea如何使用git
  • python程序打包——nuitka使用
  • 「数据可视化 D3系列」入门第三章:深入理解 Update-Enter-Exit 模式
  • 中国国家电影局与俄罗斯文化部签署电影合作文件
  • 对话哭泣照被恶意盗用成“高潮针”配图女生:难过又屈辱
  • 汪海涛评《线索与痕迹》丨就虚而近实
  • 4月份全球制造业PMI继续下降,经济下行压力有所加大
  • 夹缝中的责编看行业:长视频之殇,漫长周期
  • 山大齐鲁医院回应论文现“男性确诊子宫肌瘤”:给予该护士记过处分、降级处理