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

目录

日志

项目总结

新建一个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.mzph.cn/pingmian/16920.shtml

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

相关文章

物联网六大核心技术——青创智通

工业物联网解决方案-工业IOT-青创智通 物联网六大核心技术&#xff0c;是构建万物互联的基础&#xff0c;它们相互协作&#xff0c;共同实现物联网的广泛应用和深远影响。这六大技术分别是感知技术、网络通信技术、智能识别技术、计算技术、平台技术和安全技术&#xff0c;它们…

aws lakeformation注册s3位置的原因

参考资料 lakeformation底层数据的访问逻辑 向lakeformation注册s3位置的目的是让lakeformation控制对AWS S3 位置底层数据的访问&#xff08;以下简称LF&#xff09; 注册s3位置后可以进行两种授权 数据访问授权&#xff08;SELECT、INSERT 和 DELETE&#xff09; 数据位置…

不含一阶导数项的线性二阶微分方程的通解

假设这里有一个线性二阶微分等式&#xff0c;形式如下&#xff1a; &#xff08;1&#xff09; 其中是连续的&#xff0c;是在实闭区间是连续的,如果有人倾向于推广&#xff0c;在相对假弱的假设下&#xff0c;这个结果能够被发现。如果是下列其次线性方程的任意两个线性无关的…

小度推出全球首款基于文心大模型的学习机Z30,仅售价6699元

5月27日&#xff0c;小度科技召开新品发布会&#xff0c;全球首款基于文心大模型的学习机——小度学习机Z30重磅发布。 据「TMT星球」了解&#xff0c;该产品基于文心大模型&#xff0c;重新定义了“AI老师”的能力边界&#xff0c;不仅是一款能为孩子提供全面、有效学习辅导的…

报修新选择:一款软件搞定所有维修问题

数字化、智能化时代发展迅速&#xff0c;各类便捷、智能化软件应用已经深入到我们生活和工作的方方面面。尤其是在企业或学校的设备管理中&#xff0c;报修维修工作一直是一个重要环节。传统的报修方式&#xff0c;如电话报修、填写纸质报修单等&#xff0c;已经无法满足现代高…

Superset二次开发之柱状图自定义初始化时Data Zoom数据缩放值

Superset项目柱状图来自Echarts 首先Echarts实现柱状图数据缩放初始化默认值的效果 核心代码 设置Datazoom 的start 和end myChart.showLoading(); $.get(ROOT_PATH /data/asset/data/obama_budget_proposal_2012.list.json,function (obama_budget_2012) {myChart.hideLoa…

Python 文件操作指南:使用 open 和 with open 实现高效读写

&#x1f340; 前言 博客地址&#xff1a; CSDN&#xff1a;https://blog.csdn.net/powerbiubiu &#x1f44b; 简介 本系列文章主要分享文件操作&#xff0c;了解如何使用 Python 进行文件的读写操作&#xff0c;介绍常见文件格式的读取和写入方法&#xff0c;包括TXT、 CS…

aws lakeformation工作流程和权限管理逻辑

lakeformation在IAM权限模型之外提供独立的更细粒度的权限&#xff0c;控制数据湖数据的访问 能够提供列、行和单元格级别的精细控制 lakeformation的目的是要取代s3和iam策略&#xff0c;主要功能为 数据摄入&#xff0c;LF可以将不同类型的数据统一管理安全管理&#xff0…

小程序内使用路由

一:使用组件 1)创建组件 2)在需要的页面的json/app.json可实现局部使用和全局使用 在局部的话,对象内第一层,window配置也是第一层,而在全局配置也是在第一层,window在window对象内.第二层.内部执行遍历不一样. 3)页面使用 上述所写可实现在页面内使用组件.效果是页面内可以将…

十四天学会Vue——Vue核心(理论+实战)中篇(第二天)

声明&#xff1a;是接着上篇讲的哦&#xff0c;感兴趣可以去看一看~ 这里一些代码就不写了&#xff0c;为了缩减代码量&#xff0c;大家知道就可以了&#xff1a; Vue.config.productionTip false //阻止 vue 在启动时生成生产提示。热身小tips&#xff0c;可以安装这个插件&…

阿里通义千问大模型AI接入火车头自动生成内容插件

插件特点&#xff1a; 可以根据采集的关键词&#xff0c;自动生成文章可自定义提示词 也可以分析标题重写一个标题2个提问标签 如有需要可自由增加对话标签自己可以设置TXT关键词导入&#xff0c;自动采集生成 安装说明&#xff1a; 1.需要python环境 &#xff0c;具体可以…

新楚文化知网收录文学艺术类期刊投稿

《新楚文化》是由国家新闻出版总署批准&#xff0c;湖北省文学艺术界联合会主管&#xff0c;湖北今古传奇传媒集团有限公司主办的正规期刊。主要刊登文化、文学、艺术类稿件&#xff1b;包括传统文化、非遗、历史文化、地方文化、中外友好文化交流、文学作品研究、艺术研究等方…

在C++中自定义命名空间,在命名空间中定义string变量,同时定义一个函数实现单词逆置

代码 #include <iostream> #include <cstring> using namespace std; namespace my_space {string s;void reverse(string s);//定义逆置函数 } using namespace my_space; void my_space::reverse(string s){int lens.size();int i0;int jlen-1;while(i<j){//…

恶意退市潮?

一张A4纸&#xff0c;炸出一池鱼。史上&#xff08;最&#xff09;严新规&#xff0c;这一拳打到了&#xff08;违规减持&#xff09;上。 新规算是对新国九条的补充&#xff0c;更是给大股东们上紧箍咒。那市场买账吗&#xff1f;昨晚爆出19家董监高亲属&#xff08;违规&…

wireshark抓包,丢包分析?

前言 我们都知道&#xff0c;一般流量分析设备都支持pcap回放离线分析的功能&#xff0c;但如果抓的pcap丢了包&#xff0c;会影响最终安全测试的效果。比如说竞测现场需要提供pcap包测试恶意文件的检测功能&#xff0c;如果pcap中丢包&#xff0c;可能会导致文件还原失败&…

高稳定数显芯片防干扰抗噪数码屏驱动高亮LED驱动IC-VK16K33A/AA 最大13×3的按键扫描

产品型号&#xff1a;VK16K33A/AA 产品品牌&#xff1a;永嘉微电/VINKA 封装形式&#xff1a;SOP28/SSOP28 原厂&#xff0c;工程服务&#xff0c;技术支持&#xff01; 概述 VK16K33A/AA是一种带按键扫描接口的数码管或点阵LED驱动控制专用芯片&#xff0c;内部集成有数据…

2024系统架构师软考考题考点回忆版

2024年5月25日系统架构师软考试题/考点梳理 选择题 (75道单选题) 软件测试(P205) 静态测试:是被测程序不运行,只依靠分析和检查源程序的语句、结构、过程来检查程序是否有错误。动态测试:运行被测试程序,对得到的结果与预期的结果进行比较分析,同时分析运行效率和健壮…

RK3568笔记二十七:LPRNet车牌识别

若该文为原创文章&#xff0c;转载请注明原文出处。 记录自训练并在RK3568上部署。 一、介绍 LPRNet的Pytorch实现&#xff0c;一种高性能和轻量级的车牌识别框架。完全适用于中国车牌识别&#xff08;Chinese License Plate Recognition&#xff09;及国外车牌识别&#xf…

张大哥笔记:赚钱高手养成计划---如何将一份时间产生N份收入?

我们常说的赚钱的四种境界有哪些&#xff1f; 1.靠体力挣钱 2.靠技能挣钱 3.靠知识挣钱 4.靠平台钱生钱 所以对应的收入的模式就会是下面4种模式&#xff1a; 1.一份时间卖1次 2.一份时间卖N次 3.一份时间溢价卖N次 4.购买他人时间为自己所用 时间对于每个人都是相同的…

书生·浦语大模型全链路开源体系-作业1

视频链接&#xff1a;书生浦语大模型全链路开源体系_哔哩哔哩_bilibili 1. LLM发展 LLM是近年来人工智能领域的一个重要发展方向。大型语言模型的历史可以追溯到2017年,当时OpenAI推出了GPT-1(Generative Pre-trained Transformer)模型,这是一个基于Transformer架构的语言生成…