SpringBoot——整合SLF4j进行日志记录

news2024/9/21 22:43:49

目录

日志

项目总结

新建一个SpringBoot项目

 pom.xml

application.properties项目配置文件

logger.xml日志配置文件

TestController控制器

SpringbootSlf4jApplication启动类

启动项目

生成logger.log日志文件


日志

  • 在开发中,我们经常使用 System.out.println() 来打印一些信息,但是这样大量地使用System.out 会增加资源的消耗。所以在实际项目中使用 SLF4j 的 logback 来输出日志,效率更高
  • Spring框架日志管理默认选择的是JCL
  • Spring Boot默认使用的日志抽象层是 SLF4j ,默认使用的日志实现层是 logback

常用日志框架: 

常用的日志框架简要介绍
JUL(java.util.logging.Logger)
  • 系统自带
  • 功能不够强大
Apache Commons Logging
  • 由Apache提供的一个通用日志API
  • 在程序运行时,通过动态机制自动找到真正使用的日志库
Log4j
  • 主要组成部分:
    • Logger(日志记录器):控制日志的输出级别与是否输出日志
    • Appender(输出端):指定日志的输出地点
    • Layout(日志格式化器):控制日志信息的输出格式
  • 7种log级别:(从低到高)TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF
  • 支持两种格式的配置文件:properties和XML
Logback
  • 是Log4j的升级版
  • 分成3个模块:
    • logback-core
    • logback-classic
    • logback-access
Log4j2
  • 是Log4j和Logback的升级版

SLF4J

(Simple Loggin Facade for Java,简单日志门面)

  • 是对所有日志框架制定的一种规范、标准和接口,不是具体的框架
  • 需要和诸如上面的具体框架配合使用
  • 多为SLF4J+Logback或SLF4J+Log4j2组合使用

 日志级别:(输出当前级别以及更高级别的日志信息)

日志级别描述
OFF关闭:不输出日志
FATAL致命:输出可能会导致应用程序终止(崩溃)的错误
ERROR错误:输出程序的错误(不会导致程序崩溃的错误)
WARN警告:提示可能出现的问题
INFO信息:输出应用运行过程的详细信息
DEBUG调试:输出对调试有用的信息
TRACE跟踪:输出程序的运行轨迹
ALL所有:输出所有级别的信息

 日志格式变量:

日志格式变量描述
%level输出日志的级别
%date 或 %d日志发生的时间
%logger

输出Logger的类路径,包名+类名

{n}限定了输出长度

%thread当前线程名
%M日志发生时的方法名
%L

日志调用代码所在行

(可能对性能有消耗)

%m日志消息
%n

换行

项目总结

  1. 通常情况下,Spring Boot会默认使用Logback作为日志实现,并已经将相应的依赖包含在内
  2. 配置日志:创建一个logback.xml文件(或者logback-spring.xml,用于Spring Boot项目),在这个文件中配置日志输出格式、日志级别、日志文件路径等信息。
  3. 使用SLF4J接口:在你的代码中,使用SLF4J提供的Logger接口来记录日志。通过调用不同级别的log方法,你可以记录不同级别的日志信息。
  4. 运行应用程序:当你启动你的Spring Boot应用程序时,SLF4J会将日志信息传递给你配置的日志框架(比如Logback),然后根据你的配置输出日志到指定的地方,比如控制台或日志文件。

新建一个SpringBoot项目

项目结构:

 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.3.12.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.study</groupId>
	<artifactId>springboot_slf4j</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>springboot_slf4j</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>8</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

application.properties项目配置文件

# 使用logback.xml来配置日志
logging.config=classpath:logback.xml

logger.xml日志配置文件

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/>
    <property name="FILE_PATH" value="F:/JavaProject2024_4_17/springboot_slf4j/logger.log"/>

    <!--定义控制台按照上面配置的LOG_PATTERN来打印日志-->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${LOG_PATTERN}</pattern>
        </encoder>
    </appender>

    <!--按照上面配置的FILE_PATH路径来保存日志-->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${FILE_PATH}</file> <!-- 修改为file节点来指定日志文件路径 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${FILE_PATH}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!--日志保存15天-->
            <maxHistory>15</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!--单个日志文件超过10M,则新建日志文件存储-->
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder>
            <!--按照上面配置的LOG_PATTERN格式来打印日志-->
            <pattern>${LOG_PATTERN}</pattern>
        </encoder>
    </appender>

    <!--定义日志输出级别,并引入上面的Appender,使其生效-->
    <logger name="com.study.springboot_slf4j.controller" level="INFO"/>
    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE"/>
    </root>
</configuration>

TestController控制器

  • Logger接口是SLF4J(Simple Logging Facade for Java)日志门面(Facade)提供的一个接口,它允许开发人员在应用程序中记录日志。

  • SLF4J是一个为Java平台设计的简单日志门面,可以与不同的日志实现(如Logback、Log4j、java.util.logging等)结合使用。

  • Logger接口提供了各种用于记录不同级别日志的方法,包括debug、info、warn、error等。通过使用这些方法,开发人员可以在代码中插入日志语句来记录应用程序在运行时的状态、调试信息、错误信息等,以便在需要时进行排查和分析。

  • 通常情况下,开发人员会在类中创建一个静态的Logger实例,并使用LoggerFactory工厂类来获取Logger实例

  • 通过使用Logger接口,开发人员可以将日志信息传递给SLF4J,并由SLF4J将其转发到相应的日志框架进行处理和输出。这样做的好处是,开发人员可以在不同的日志框架之间切换而无需修改应用程序中的日志记录代码。

package com.study.springboot_slf4j.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/test")
public class TestController {

    private final static Logger logger= LoggerFactory.getLogger(TestController.class);

    @RequestMapping("/log")
    public String testLog(){
        logger.debug("===========测试日志debug级别打印===========");
        logger.info("===========测试日志info级别打印===========");
        logger.error("===========测试日志error级别打印===========");
        logger.warn("===========测试日志warn级别打印===========");

        //可使用占位符打印出一些参数信息
        String str1="Spring Boot";
        String str2="SLF4j";
        logger.info("当前案例使用的是{}整合{}案例!",str1,str2);
        return "日志记录成功";

    }
}

SpringbootSlf4jApplication启动类

package com.study.springboot_slf4j;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringbootSlf4jApplication {
	public static void main(String[] args) {
		SpringApplication.run(SpringbootSlf4jApplication.class, args);
	}
}

启动项目

1、访问网址:http://localhost:8080/test/log

2、控制台输出:

3、项目生成logger日志文件

生成logger.log日志文件

<property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/>j

日志根据logger.xml配置文件里定义的打印格式进行输出

2024-05-27 17:36:06.183 [main] INFO  c.s.s.SpringbootSlf4jApplication - Starting SpringbootSlf4jApplication on Administrator with PID 9496 (F:\JavaProject2024_4_17\springboot_slf4j\target\classes started by Administrator in F:\JavaProject2024_4_17\springboot_slf4j)
2024-05-27 17:36:06.198 [main] INFO  c.s.s.SpringbootSlf4jApplication - No active profile set, falling back to default profiles: default
2024-05-27 17:36:06.948 [main] INFO  o.s.b.w.e.tomcat.TomcatWebServer - Tomcat initialized with port(s): 8080 (http)
2024-05-27 17:36:06.948 [main] INFO  o.a.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8080"]
2024-05-27 17:36:06.948 [main] INFO  o.a.catalina.core.StandardService - Starting service [Tomcat]
2024-05-27 17:36:06.948 [main] INFO  o.a.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/9.0.46]
2024-05-27 17:36:06.948 [main] INFO  o.a.c.core.AprLifecycleListener - An older version [1.2.16] of the Apache Tomcat Native library is installed, while Tomcat recommends a minimum version of [1.2.23]
2024-05-27 17:36:06.948 [main] INFO  o.a.c.core.AprLifecycleListener - Loaded Apache Tomcat Native library [1.2.16] using APR version [1.6.3].
2024-05-27 17:36:06.964 [main] INFO  o.a.c.core.AprLifecycleListener - APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].
2024-05-27 17:36:06.964 [main] INFO  o.a.c.core.AprLifecycleListener - APR/OpenSSL configuration: useAprConnector [false], useOpenSSL [true]
2024-05-27 17:36:07.980 [main] INFO  o.a.c.core.AprLifecycleListener - OpenSSL successfully initialized [OpenSSL 1.0.2m  2 Nov 2017]
2024-05-27 17:36:08.058 [main] INFO  o.a.c.c.C.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext
2024-05-27 17:36:08.058 [main] INFO  o.s.b.w.s.c.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 1813 ms
2024-05-27 17:36:08.183 [main] INFO  o.s.s.c.ThreadPoolTaskExecutor - Initializing ExecutorService 'applicationTaskExecutor'
2024-05-27 17:36:08.292 [main] INFO  o.a.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8080"]
2024-05-27 17:36:08.308 [main] INFO  o.s.b.w.e.tomcat.TomcatWebServer - Tomcat started on port(s): 8080 (http) with context path ''
2024-05-27 17:36:08.323 [main] INFO  c.s.s.SpringbootSlf4jApplication - Started SpringbootSlf4jApplication in 2.422 seconds (JVM running for 3.554)
2024-05-27 17:36:20.759 [http-nio-8080-exec-1] INFO  o.a.c.c.C.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet'
2024-05-27 17:36:20.759 [http-nio-8080-exec-1] INFO  o.s.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet'
2024-05-27 17:36:20.762 [http-nio-8080-exec-1] INFO  o.s.web.servlet.DispatcherServlet - Completed initialization in 3 ms
2024-05-27 17:36:20.777 [http-nio-8080-exec-1] INFO  c.s.s.controller.TestController - ===========测试日志info级别打印===========
2024-05-27 17:36:20.777 [http-nio-8080-exec-1] ERROR c.s.s.controller.TestController - ===========测试日志error级别打印===========
2024-05-27 17:36:20.777 [http-nio-8080-exec-1] WARN  c.s.s.controller.TestController - ===========测试日志warn级别打印===========
2024-05-27 17:36:20.777 [http-nio-8080-exec-1] INFO  c.s.s.controller.TestController - 当前案例使用的是Spring Boot整合SLF4j案例!

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

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

相关文章

会声会影2023永久激活版下载 会声会影2023序列号免费 会声会影下载免费中文破解版

会声会影2023永久激活版是一款最新推出的多功能视频剪辑软件&#xff0c;这款软件不仅完美继承了之前多个版本当中的强大功能。而且我们还可以通过会声会影2023永久激活版来体验到标题动态选项、标题特效等多个全新的功能&#xff0c;让你可以更加快速地进行视频编辑。 会声会影…

爬虫利器Frida RPC入门——夜神模拟器环境篇

Frida是一款轻量级HOOK框架&#xff0c;可用于多平台上&#xff0c;例如android、windows、ios等。 frida分为两部分&#xff0c;服务端运行在目标机上&#xff0c;通过注入进程的方式来实现劫持应用函数&#xff0c;另一部分运行在系统机器上。frida上层接口支持js、python、…

备忘录可以统计字数吗?备忘录里在哪查看字数?

在这个信息爆炸的时代&#xff0c;很多人喜欢使用备忘录app来记录生活中的点点滴滴。备忘录不仅可以帮助我们记事、安排日程&#xff0c;还能提醒我们完成各种任务&#xff0c;是我们日常生活中不可或缺的小助手。 然而&#xff0c;在使用备忘录时&#xff0c;有时我们会遇到需…

(已解决)使用IDEA开发工具提交代码时,如何获取最新的commit信息历史记录

目录 问题现象&#xff1a; 问题分析&#xff1a; 方法一&#xff1a;从commit信息历史记录中选取自己想要的commit信息 总结&#xff1a; 方法二&#xff1a;直接获取commit信息历史记录中最新的commit信息 总结&#xff1a; 解决方法&#xff1a; 方法一&#xff1a;…

【云原生】Kubernetes中的List-Watch机制详解与容器生命周期

目录 引言 一、List-Watch机制概述 &#xff08;一&#xff09;基本概念 &#xff08;二&#xff09;工作机制 1.List操作 2.Watch操作 &#xff08;三&#xff09;数据流向 1.按模块划分 2.按整体总结 二、Pod生命周期 &#xff08;一&#xff09;生命周期 1.创建…

单片机方案开发个性定制

酷得智能是玩具企业合作方案商&#xff0c;致力于为玩具企业提供一站式的智能化解决方案。我们拥有丰富的行业经验和技术实力&#xff0c;能够根据客户的需求和市场趋势&#xff0c;为其量身定制最适合的智能玩具产品和解决方案。 主营业务&#xff1a; 东莞市酷得智能科技有限…

实时工业数据采集分析平台:推动工厂智能化的关键

在当今的工业领域&#xff0c;随着科技的飞速发展和竞争的日益激烈&#xff0c;实现工厂的智能化已成为企业追求持续发展的关键目标。而实时工业数据采集分析平台作为推动工厂智能化的重要力量&#xff0c;正发挥着重要的作用。 实时工业数据采集分析平台能够全方位、高精度地…

Linux 中的进程优先级管理

在 Linux 系统中&#xff0c;理解和管理进程优先级是维护系统性能的关键因素。本文将详细介绍进程优先级&#xff08;priority&#xff09;的基本概念、如何查看和调整进程优先级&#xff0c;以及 nice 值对优先级的影响。 基本概念 在多任务操作系统中&#xff0c;CPU 资源的…

JavaSE 字符串String及相关API StringBuilder StringJoiner 底层原理 详解

字符串和相关API java不会字符串即凉一半 学好字符串很重要 API 为应用程序编程接口 获得字符串对象 1.直接赋值 空参构造 string s1“abc”; s1 记录的是串池里的地址 2.用new的方式 string s2new string&#xff08;&#xff09;; new&#xff08;在堆内存里开辟空…

JSON-RPC跨域通信:Python服务器端解决方案与Js客户端 Mozilla扩展程序

问题背景 构建一个 Mozilla 扩展程序&#xff0c;与远程服务器上的 Python 应用程序进行通信以发送和接收数据。Python 应用程序可以通过 Python 控制台使用 xml-rpc 调用。尝试设计一个 JSON-RPC 来联系同一个应用程序。开发 Python 服务器端&#xff0c;可以通过 python 控制…

SEC批准以太坊ETF了吗?

原创 | 刘教链 隔夜BTC击穿了5日均线&#xff0c;回落至67k一线。凌晨传来美SEC批准以太坊ETF的消息&#xff0c;但是ETH上下插针&#xff0c;杵在3.8k&#xff0c;微微下跌。定睛仔细一看&#xff0c;SEC批准了&#xff0c;但又没完全批准&#xff0c;这特么是薛定谔的批准哈&…

【多线程】线程安全

目录 1.观察线程不安全 2.线程不安全的原因 2.1 随机调度 2.2 修改共享数据 2.3 原子性 2.4 内存可见性 2.5 指令重排序 3.synchronized 加锁操作 3.1 synchronized是什么&#xff1f; 3.2 synchronized的特性 1) 互斥 2) 可重入 3.3 synchronized使用示例 3.3.1 针…

安卓手机APP开发__平台的架构

安卓手机APP开发__平台的架构 目录 概述 安卓软件栈 Linux内核 硬件抽象层(HAL) 安卓运行时 原生的C/C代码库 Java API框架 系统APP 概述 安卓是一个开源的&#xff0c;基于Linux的软件栈&#xff0c;它创建一个设备和形式因素的很宽的矩阵。 下图展示了安卓平台的所有…

MyBatis-Plus 从入门到精通

MyBatis-Plus 从入门到精通 前言快速入门创建一个SpringBoot项目导入依赖配置数据库创建一个实体类创建一个mapper接口在SpringBoot启动类上配置mapper接口的扫描路径在数据库中创建表编写一个SpringBoot测试类 核心功能注解CRUD接口Mapper CRUD接口Service CRUD 接口条件构造器…

C字符串和内存函数介绍(二)——长度不固定的字符串函数

前面我们一起学习了strlen&#xff0c;strcpy&#xff0c;strcmp&#xff0c;strcat的使用以及它们的模拟实现&#xff0c;它们的特点是你传参的时候&#xff0c;传过去的是数组首元素的地址&#xff0c;然后无论是计算长度&#xff0c;实现拷贝&#xff0c;相互比较还是进行追…

布局、基本控件

一、as布局 布局文件 layout drawable 设置背景的文件 新建drawable-xhdpi文件 — 放一些item或图片 values&#xff1a; theme app风格&#xff0c;string 字符串&#xff08;相当于宏定义&#xff0c;可以引用&#xff09;&#xff0c;colors颜色配置&#xff08;可以引用…

新闻稿推广策略有哪些?建议收藏

新闻稿推广是一种有效的公关工具&#xff0c;它可以帮助企业或组织传递信息、提升品牌知名度、建立权威形象&#xff0c;并最终促进销售。新闻稿推广策略有哪些&#xff1f;接下来伯乐网络传媒就来给大家分享一下。 确定目标受众&#xff1a;在撰写新闻稿之前&#xff0c;明确你…

MATLAB导入导出Excel的方法|读与写Excel的命令|附例程的github下载链接

前言 前段时间遇到一个需求&#xff1a;导出变量到Excel里面&#xff0c;这里给出一些命令&#xff0c;同时给一个示例供大家参考。 MATLAB读/写Excel的命令 在MATLAB中&#xff0c;可以使用以下命令来读写Excel文件&#xff1a; 读取Excel文件&#xff1a; xlsread(filen…

文件加密软件排行榜前十:好用的文件加密软件推荐

文件加密软件是企业保护数据安全的有效手段。 选择文件加密软件时&#xff0c;不仅要考虑加密强度&#xff0c;还要兼顾易用性、兼容性及是否满足特定需求。 下面小编将推荐几款好用的文件加密软件&#xff0c;比如以下十款软件排行榜。 以下十款软件各有所长&#xff0c;有…

全能集成开发平台Team·IDE

三甲医院的床位太难等了。反正也是小手术&#xff0c;老苏周五在附近找了家二甲医院&#xff0c;幸运的是&#xff0c;门诊迅速为我开具了入院证。周六早晨就接受了手术&#xff0c;周日挂了一天水&#xff0c;周一下午就出院了。准备在家先休息两天。 2~4 周之后把支架取出来…