设置spring boot禁止日志输出到控制台

news/2024/9/21 22:06:59/

我们一个Spring Boot项目,使用了org.slf4j.Logger.info记录日志。类似代码如下:

@Slf4j
public class CTest {public void test() {。。。log.info("Hello World!");}
}

结果运行的时候,系统除了将日志记录到日志文件,还将日志打印到控制台。由于日志太多太密集,屏幕不停地滚动,令人目不暇接,加上乱码,简直不知所谓。

为啥日志还会自动输出到控制台呢?我一向孤陋寡闻,好奇去问AI。AI告诉我,系统使用org.slf4j.Logger.info记录日志,而SLF4J 只是一个日志门面(Facade),具体的日志记录行为是由绑定的具体日志实现框架(如 Logback、Log4j、java.util.logging 等)决定的。就相当于,org.slf4j.Logger.info只定义了日志的接口,具体实现要看用了什么日志工具包。如果没有指定,Spring Boot会默认采用Logback。我看了看pom.xml,没有发现有引用什么日志包,因此可以确定,我们系统用的应该是Logback。我记得Spring Boot的核心是控制反转(IoC),AOP和容器,然后AI说,除此之外,还有约定大于配置,自动配置,起步依赖等等。起步依赖就是为程序启动自动提供了许多准备,自动配置应该就包含了上面说的,默认采用Logback作为日志框架的做法。

一、禁止日志输出到控制台

回到日志内容默认输出到控制台,这是Logback的做派。如果要禁止,需要在配置文件或代码中指定。这个配置文件,不是指application.yml这种Spring Boot项目级的配置文件,它们只能简单地设置日志的输出级别和输出路径,而禁止输出到控制台,只能在专有的logback-spring.xml进行配置。

1、application.yml只能简单地设置日志的输出级别和输出路径

application.yml

logging:level:root: info      # 设置全局日志级别com.yourpackage: debug  # 针对特定包的日志级别file:path: ./log/seller.log  # 日志输出路径pattern:file: '%d{yyyy-MM-dd HH:mm:ss} - %msg%n'  # 日志文件的格式console: '%d{yyyy-MM-dd HH:mm:ss} - %msg%n'  # 控制台输出的日志格式

logbackspringxml_34">2、日志配置文件logback-spring.xml设置

logback-spring.xml需要手动创建,位置也是在resources根目录下,SpringBoot会自动识别。文件内容如下:

resources/logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration><!-- 定义文件日志输出 --><appender name="FILE" class="ch.qos.logback.core.FileAppender"><file>./log/seller.log</file><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss} - %msg%n</pattern></encoder></appender><!-- 配置 root 只使用文件输出 --><root level="info"><appender-ref ref="FILE" /></root>
</configuration>

3、也可以通过配置类进行设置

当然也可以通过创建配置类来设置:

import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.core.Appender;
import ch.qos.logback.core.ConsoleAppender;
import ch.qos.logback.core.FileAppender;
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import ch.qos.logback.classic.spi.ILoggingEvent;
import java.util.Iterator;@Configuration
public class LoggingConfig {@Beanpublic void configureLogging() {LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();Logger rootLogger = loggerContext.getLogger("ROOT");// 移除 ConsoleAppenderremoveConsoleAppender(rootLogger);// 添加 FileAppenderaddFileAppender(loggerContext, rootLogger);}private void removeConsoleAppender(Logger rootLogger) {Iterator<Appender<ILoggingEvent>> iterator = rootLogger.iteratorForAppenders();while (iterator.hasNext()) {Appender<ILoggingEvent> appender = iterator.next();if (appender instanceof ConsoleAppender) {rootLogger.detachAppender(appender);appender.stop();}}}private void addFileAppender(LoggerContext context, Logger rootLogger) {// 创建 FileAppenderFileAppender<ILoggingEvent> fileAppender = new FileAppender<>();fileAppender.setContext(context);fileAppender.setFile("./log/seller.log");// 设置日志输出格式PatternLayoutEncoder encoder = new PatternLayoutEncoder();encoder.setContext(context);encoder.setPattern("%d{yyyy-MM-dd HH:mm:ss} - %msg%n");encoder.start();fileAppender.setEncoder(encoder);fileAppender.start();// 添加到 rootLoggerrootLogger.addAppender(fileAppender);}
}

二、设置日志输出级别

Logback的日志输出有所谓级别:Level: FATAL 0 ERROR 3 WARN 4 INFO 6 DEBUG 7
其中FATAL最高,DEBUG最低。级别越高,记录到日志的机会就越小。如果设为DEBUG,可能日志内容会很多。
这是我另外一个项目中,resources/logback-spring.xml的部分内容

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false" scan="false">。。。<!-- Level: FATAL 0  ERROR 3  WARN 4  INFO 6  DEBUG 7 --><root level="warn"><appender-ref ref="console"/><appender-ref ref="debug"/><appender-ref ref="error"/></root>
</configuration>

三、日志输出到控制台乱码问题

我发现,日志内容输出到控制台,其中的汉字会是乱码。IDE、运行jar包的命令行、包括日志配置文件都设了UTF-8,但仍然是乱码。但如果用System.out.println()直接输出到控制台,又正常。这个问题暂时还没有解决。

记录一下。


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

相关文章

【Day14-单例设计模式动态代理】

单例设计模式 什么是设计模式&#xff08;Design pattern&#xff09; ? 一个问题通常有n种解法&#xff0c;其中肯定有一种解法是最优的&#xff0c;这个最优的解法被人总结出来了&#xff0c;称之为设计模式。设计模式有20多种&#xff0c;对应20多种软件开发中会遇到的问题…

【LLM】吴恩达『微调大模型』代码笔记(03_Instruction_tuning_lab_student)【如何进行推断函数定义】

关注B站可以观看更多实战教学视频&#xff1a;hallo128的个人空间 【LLM】吴恩达『微调大模型』代码笔记&#xff08;03_Instruction_tuning_lab_student&#xff09; 指令微调&#xff08;代码详解-代码及输出结果&#xff09; 1. 推断函数定义 # 通过 AutoTokenizer 从预训…

TCP四大拥塞控制算法总结

四大算法&#xff1a;1.慢启动&#xff0c;2.拥塞避免&#xff0c;3.拥塞发生&#xff0c;4.快速恢复。 慢启动&#xff1a; 首先连接建好的开始先初始化拥塞窗口cwnd大小为1&#xff0c;表明可以传一个MSS大小的数据。 每当收到一个ACK&#xff0c;cwnd大小加一&#xff0c…

二级C语言2024-3易错题

1 结构 一个C语言程序是由&#xff08; &#xff09;。 A. 一个主程序和若干子程序组成 B. 函数组成 C. 若干过程组成 D. 若干子程序组成 一个C语言程序是由多个部分组成的&#xff0c;其中最核心的部分是函数。在C语言中&#xff0c;函数是实现特定功能的代码块&#xff0c;…

人才有约,职为你:颐年集团携手粤荣学校共绘养老行业的美好未来

摘要&#xff1a;广州市白云区粤荣职业培训学校成功举办“人才有约&#xff0c;职为你”颐年集团养老机构线下招聘会 2024年9月19日下午2点30分&#xff0c;广州市白云区金骊城二楼热闹非凡。粤荣职业培训学校携手颐年集团&#xff0c;共同举办了主题为“人才有约&#xff0c;…

Redis基本命令详解

1. 基本命令 命令不区分大小写&#xff0c;而key是区分大小写的 # select 数据库间的切换 数据库共计16个 127.0.0.1:6379> select 1# dbsize 返回当前数据库的 key 的数量 127.0.0.1:6379[1]> dbsize# keys * 查看数据库所有的key 127.0.0.1:6379[1]> keys *# fl…

前端web端项目运行的时候没有ip访问地址

我们发现 没有netWork 的地址 导致 团队内其他同学无法打开我们的地址 进行访问 在page.json 中的运行 指令中 添加 --host 记得加上空格 这样我们就可以看到这个地址了 团队其他同学 就可以访问我们这个地址了

今日leetCode 18. 四数之和

18. 四数之和 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元组元素一一对应&#xff0c;则认为两个四元组重复&#xff09;&#xff…