使用大模型学习logback框架,太香了

news/2025/1/13 7:40:18/

大模型,如chatGPT3.5、GPT-4,国内的文心一言、通义千问、讯飞星火等,对文字工作者,图片、视频工作者的工作效率提升是巨大的,当你学会使用这些工具之后,你的工作和学习效率会大大提升,把其他人甩在身后。

今天,我就用 zelinAI 包装 chatGPT3.5 学习了 Spring Boot 项目使用 logback 打印日志的最佳实践,效率杠杠的,一起来学习吧。

使用spring boot项目打印log的最佳实践,给出代码


Spring Boot 项目打印 log 的最佳实践是使用 SLF4J API,以及在 logback.xml 中进行配置。

SLF4J(Simple Logging Facade for Java)是一种针对 Java 应用开发的日志规范,支持多种日志实现(如 log4j、logback)。在 Spring Boot 项目中,可以使用 SLF4J API 进行统一的日志输出。

具体使用方法如下:

  1. 添加 Maven 依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 引入 SLF4J 相关依赖 -->
<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId>
</dependency>
<dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId>
</dependency>
  1. 在 logback.xml 中进行配置

logback.xml 是 logback 日志框架的配置文件,需要放置在项目的 src/main/resources 目录下。下面是一个示例配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<configuration><!-- 定义日志输出位置 --><property name="LOG_HOME" value="${user.home}/logs" /><property name="PROJECT_NAME" value="myproject" /><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern></encoder></appender><appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${LOG_HOME}/${PROJECT_NAME}.log</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${LOG_HOME}/${PROJECT_NAME}.%d{yyyy-MM-dd}.log.gz</fileNamePattern><maxHistory>30</maxHistory></rollingPolicy><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern></encoder></appender><!-- 定义日志输出级别 --><root level="INFO"><appender-ref ref="STDOUT" /><appender-ref ref="FILE" /></root>
</configuration>

该配置文件中定义了两个日志输出器,分别是控制台输出器 STDOUT 和文件输出器 FILE。可以根据自己的需求进行修改。

同时,<root level="INFO"> 指定了日志输出的级别为 INFO,表示只输出 INFO 级别及以上的日志信息。可以根据需要修改为其他级别。

  1. 在代码中使用 SLF4J API 进行日志输出
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;@RestController
public class MyController {// 获取日志记录器对象private static final Logger logger = LoggerFactory.getLogger(MyController.class);@GetMapping("/hello")public String hello() {logger.info("hello world");return "hello world";}
}

在代码中,使用 LoggerFactory.getLogger() 方法获取 logger 对象,然后在需要输出日志的地方使用该对象的 info()error()debug() 等方法进行日志输出。

总结:使用 SLF4J API 和 logback 配置框架可以实现 Spring Boot 项目的统一日志输出,增强日志的可维护性和易读性。


我继续问

那么,有哪些框架实现了 SLF4J 接口


SLF4J 接口是一个日志统一接口,不能单独使用,需要与具体的日志框架结合使用。以下是一些常用的日志框架,它们都实现了 SLF4J 接口:

  • logback:一个优秀的、支持 SLF4J 的日志库,由 log4j 的创始人设计开发,已经成为 Java Web 应用最流行的日志实现;
  • log4j2:Apache 的日志库,支持 SLF4J 接口,是 log4j 的改进版;
  • JULI(Java Util Logging):Java 标准库自带的一套日志系统,简单易用,常用于 Java 内置 Web 容器 Tomcat/Jetty;
  • log4j:Apache 的经典日志库,也支持 SLF4J 接口,但已经是老版的日志系统,现在一般使用 log4j2 来代替。

我发现项目中除了 info.log, error.log, debug.log 之外,还有其他很多自定义命名的 log 文件,这个是怎么实现的?看了下项目代码,发现都有个 name 属性。根据这个继续问它:

logback 怎么根据 appender name 创建不同的日志文件,在java代码中如何使用,请给出代码示例

logback.xml 配置文件中,每个 <appender> 标签都对应着一个 appender 的实例,而每个 appender 都可以指定一个唯一的 name 属性值来标识自己。因此,我们可以通过为每个 appender 指定不同的 name 属性值,来创建不同的日志文件。例如:

<configuration><appender name="FILE_DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>logs/debug.log</file><!-- 其他配置... --></appender><appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>logs/error.log</file><!-- 其他配置... --></appender><root level="info"><appender-ref ref="FILE_DEBUG"/><appender-ref ref="FILE_ERROR"/></root>
</configuration>

上述配置创建了两个 appender,分别使用 name 属性为 FILE_DEBUGFILE_ERROR,分别对应着两个日志文件 debug.logerror.log。注意,我们将两个 appender 都添加到了 root 节点中,表示日志会同时输出到这两个文件中。

如果要在代码中使用这些 appender,可以分别通过 LoggerFactory.getLogger 方法获取到不同的 Logger 对象,并在代码中使用。例如:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class MyClass {private static final Logger debugLogger = LoggerFactory.getLogger("FILE_DEBUG");private static final Logger errorLogger = LoggerFactory.getLogger("FILE_ERROR");public void test() {// 输出调试日志debugLogger.debug("this is a debug log");// 输出错误日志errorLogger.error("this is an error log");}
}

上述代码中,我们分别使用了 FILE_DEBUGFILE_ERROR 两个 appender 的 Logger 对象,并在代码中通过 debugLoggererrorLogger 执行不同级别的日志输出。需要注意的是,LoggerFactory.getLogger 方法的参数需要传入对应 appender 的 name 属性值。


LoggerFactory.getLogger不指定name,使用class是什么意思呢

在使用LoggerFactory.getLogger()方法时,如果不指定name参数,则会默认使用当前类的类名作为参数。这意味着创建的日志记录器将会与当前类绑定,使用当前类的名称命名,并记录当前类中发生的事件。这种做法的优势在于,当代码复制到其他类中时,日志记录器也会自动更改为相应的类名,从而避免了手动更改记录器名称的麻烦。此外,这样做还可以避免命名冲突和混乱,使得代码更加清晰易懂。

logback打印日志的最佳实践是什么,请给出代码

logback打印日志的最佳实践通常包括以下几个方面:

  1. 使用slf4j统一日志接口,避免直接使用具体的日志框架。这样日志框架可以在不改变应用程序代码的情况下进行更换。

  2. 配置logback.xml或logback.groovy以指定日志输出格式和输出目标。要注意配置文件的路径和文件名,并保证配置文件的正确性和合理性。

  3. 使用日志级别来控制输出的详细程度。根据实际需要设置日志级别,建议在开发环境中使用DEBUG或INFO级别,而在生产环境中使用WARN或ERROR级别。

  4. 使用{}来避免字符串拼接,在需要输出大量字符串时会提高性能,减少对于字符串池的占用。使用占位符的方式输出,例如:

logger.info("用户{}登录成功", username);

此外,还可以使用条件日志,类似于断言的功能,如下所示:

logger.debug("x={}, y={}", x, y);
logger.debug("Value of i is {}, Value of j is {}", i, j);
logger.debug("Value of k is {}", k);if (logger.isDebugEnabled()) {logger.debug("The value of x is " + x);
}

根据上述最佳实践,以下是一个示例代码,假设使用了logback框架:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class MyClass {private static final Logger logger = LoggerFactory.getLogger(MyClass.class);public void doSomething() {logger.debug("doing something...");try {// do something} catch (Exception e) {logger.error("an error occurred while doing something", e);}logger.info("something has been done.");}
}

其中,类名和logger对象要相对应,logger可以根据需要使用不同的日志级别,使用{}占位符输出日志信息。


http://www.ppmy.cn/news/87863.html

相关文章

如何借助spire.doc,在 Word 中插入 OLE 对象

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

前端页面数组中对象动态切换,鼠标悬停,离开恢复自动切换

鼠标事件&#xff1a;关键词mouseenter"startScroll" mouseleave"stopScroll" “screenshotList” <div class"video-screenshot" mouseenter"startScroll" mouseleave"stopScroll"><div class"screenshot-…

Linux防火墙限制访问服务器IP和端口

Linux防火墙限制访问服务器IP和端口 笔记 逐行执行命令 firewall-cmd --state systemctl start firewalld systemctl enable firewalld firewall-cmd --get-default-zonefirewall-cmd --set-default-zonetrustedfirewall-cmd --permanent --new-zoness firewall-cmd --perma…

2023系统分析师---简答题常考概念

实体类、控制类、边界类: 实体类:实体类映射需求中的每个实体,保存需要存储在永久存储体中的信息,例如:用户、商品等; 控制类:控制类是用于控制用例工作的类,用于对一个或者几个用例所特有的控制行为进行建模。例如:结算、备货等; 边界类:边界类用于封装在用例内…

天津和平区大数据培训班哪家好?大数据适合什么人学?

当前正处于企业数据化转型的大环境&#xff0c;大数据这一行业受到越来越多人的关注&#xff0c;不少人想要借着这个势头加入大数据这一行业&#xff0c;今天小编就来给大家分析一下大数据行业&#xff0c;往下看吧。 大数据行业前景如何 大数据行业的就业前景不得不说非常好…

主机访问不到虚拟机(centos7)web服务的解决办法

目录 一、背景 二、解决办法 2.1、配置虚拟机防火墙 2.2、修改虚拟机网络编辑器 一、背景 主机可以访问外网&#xff0c;虚拟机使用命令&#xff1a;curl http://网址&#xff0c;可以访问到web服务 &#xff0c;主机使用http://网址&#xff0c;访问不到虚拟机&#xff08…

Java的内存模型(Java Memory Mode,JMM)

并发编程模型的两个关键问题 线程之间如何通信及线程之间如何同步。 线程之间如何通信&#xff1a;共享内存&#xff0c;消息传递线程之间如何同步通信是指线程之间以何种机制来 交换信息同步是指程序中用于控制不同线程间 操作发生相对顺序 的机制在共享内存的并发模型里&a…

webshell提权

首先我们要清楚为什么要提权 相关操作被拒绝。无法继续进行渗透。就需要提权 我们通过各种web漏洞&#xff0c;中间件漏洞&#xff0c;或者cms等漏洞拿到权限后。得到的权限一般是后台权限&#xff0c;有些是webshell权限。如果是后台权限&#xff0c;我们就要通过后台上传后…