大模型,如 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 进行对立的日志输入。
具体应用办法如下:
- 增加 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>
- 在 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
级别及以上的日志信息。能够依据须要批改为其余级别。
- 在代码中应用 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_DEBUG
和 FILE_ERROR
,别离对应着两个日志文件 debug.log
和 error.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_DEBUG
和 FILE_ERROR
两个 appender 的 Logger 对象,并在代码中通过 debugLogger
和 errorLogger
执行不同级别的日志输入。须要留神的是,LoggerFactory.getLogger 办法的参数须要传入对应 appender 的 name 属性值。
LoggerFactory.getLogger 不指定 name,应用 class 是什么意思呢
在应用 LoggerFactory.getLogger()办法时,如果不指定 name 参数,则会默认应用以后类的类名作为参数。这意味着创立的日志记录器将会与以后类绑定,应用以后类的名称命名,并记录以后类中产生的事件。这种做法的劣势在于,当代码复制到其余类中时,日志记录器也会主动更改为相应的类名,从而防止了手动更改记录器名称的麻烦。此外,这样做还能够防止命名抵触和凌乱,使得代码更加清晰易懂。
logback 打印日志的最佳实际是什么,请给出代码
logback 打印日志的最佳实际通常包含以下几个方面:
- 应用 slf4j 对立日志接口,防止间接应用具体的日志框架。这样日志框架能够在不扭转利用程序代码的状况下进行更换。
- 配置 logback.xml 或 logback.groovy 以指定日志输入格局和输入指标。要留神配置文件的门路和文件名,并保障配置文件的正确性和合理性。
- 应用日志级别来管制输入的具体水平。依据理论须要设置日志级别,倡议在开发环境中应用 DEBUG 或 INFO 级别,而在生产环境中应用 WARN 或 ERROR 级别。
- 应用 {} 来防止字符串拼接,在须要输入大量字符串时会进步性能,缩小对于字符串池的占用。应用占位符的形式输入,例如:
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 能够依据须要应用不同的日志级别,应用 {} 占位符输入日志信息。