第一篇-基础-第八章-日志的操作

embedded/2024/10/9 15:07:34/

日志是必需的。日志的操作必须是可统一控制、分级管理同时能保留到本地的。

8.1 SpringBoot默认的日志框架

SpringBoot支持多种日志框架,通常情况下,这些日志由一个日志抽象层和一个日志实现层搭建完成,日志抽象层是为了记录日志提供的一套标准且规范的框架,其作用是为记录日志提供接口。日志实现层是由日志抽象层实现的框架。

SpringBoot常见的日志抽象层有jcl(jakarta commons logging)、slf4j(simple logging facade for java)、jboss-logging等,常见的日志实现层有log4j、jul(java.util.logging)、log4j2、logback等,SpringBoot默认使用的日志抽象层是slf4j,默认使用的日志实现层是logback。

但是鉴于实际的使用性能和主流框架,这里实现层还是选用log4j2(它也具有Logback的所有特性)。

需要特别说明的是,在实际开发中,执行记录日志的操作不应该调用日志实现层的方法,而应该调用日志抽象层的方法。

8.2 打印日志

  • 鉴于使用了log4j2,需要引入log4j2的依赖,同时需要排除SpringBoot原始的默认实现层框架。
pom.xml进行更改
<!--将spring-web中的logging进行剔除,避免日志冲突-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></exclusion></exclusions>
</dependency>
<!--添加log4j2的依赖-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
  • 在使用slf4j打印日志时,需要创建日志对象
1,在UserController控制类创建日志对象,注意,引入的包是org.slf4j
Logger logger= LoggerFactory.getLogger(UserController.class);
或者
Logger logger= LoggerFactory.getLogger(getClass());//推荐这个2,以主要的info为例,可以填写单个参数,也可以使用占位符进行日志输出
logger.info("hello,this is logcat");
logger.info("hello,{},My name is {}","SpringBoot","Lilei");

8.3 保持日志

日志不仅仅要在控制台上显示,有时候更需要以文本形式保持,方便问题回朔。

在SpringBoot项目的application.properties中,可以配置日志的相关属性。

logging.file.path=dir         //在当前项目根目录下订单dir文件夹中生产日志文件,也可以本地目录 D:\\dir
logging.file.name=xxx.log    //指定日志文件名
logging.logback.rollingpolicy.max_history=7    //最多缓存7天
logging.logback.rollingpolicy.max-file-size=12KB //单文件最大12KB

8.4 log4j2.xml配置文件

项目中使用log4j2进行日志实现,最快捷方便的方法是在resources文件夹下添加log4j2.xml文件,直接将配置信息写入到专属日志配置文件中。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="fatal"><Properties><!--定义一个日志保存目录,mac/linux使用${sys:user.home}/logs表示用户名下面的logs目录下--><Property name="baseDir" value="C:\mytest01"/></Properties><Appenders><Console name="Console" target="SYSTEM_OUT"><!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) --><ThresholdFilter level="info" onMatch="ACCEPT"onMismatch="DENY"/><PatternLayoutpattern="[%d{MM:dd HH:mm:ss.SSS}] [%level] [%logger{36}] - %msg%n"/></Console><!--debug级别日志文件输出--><RollingFile name="debug_appender" fileName="${baseDir}/debug.log"filePattern="${baseDir}/debug_%i.log.%d{yyyy-MM-dd}"><!-- 过滤器 --><Filters><!-- 限制日志级别在debug及以上在info以下 --><ThresholdFilter level="debug"/><ThresholdFilter level="info" onMatch="DENY" onMismatch="NEUTRAL"/></Filters><!-- 日志格式 --><PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/><!-- 策略 --><Policies><!-- 每隔一天转存 --><TimeBasedTriggeringPolicy interval="1" modulate="true"/><!-- 文件大小 --><SizeBasedTriggeringPolicy size="100 MB"/></Policies></RollingFile><!-- info级别日志文件输出 --><RollingFile name="info_appender" fileName="${baseDir}/info.log"filePattern="${baseDir}/info_%i.log.%d{yyyy-MM-dd}"><!-- 过滤器 --><Filters><!-- 限制日志级别在info及以上在error以下 --><ThresholdFilter level="info"/><ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/></Filters><!-- 日志格式 --><PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/><!-- 策略 --><Policies><!-- 每隔一天转存 --><TimeBasedTriggeringPolicy interval="1" modulate="true"/><!-- 文件大小 --><SizeBasedTriggeringPolicy size="100 MB"/></Policies></RollingFile><!-- error级别日志文件输出 --><RollingFile name="error_appender" fileName="${baseDir}/error.log"filePattern="${baseDir}/error_%i.log.%d{yyyy-MM-dd}"><!-- 过滤器 --><Filters><!-- 限制日志级别在error及以上 --><ThresholdFilter level="error"/></Filters><!-- 日志格式 --><PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/><Policies><!-- 每隔一天转存 --><TimeBasedTriggeringPolicy interval="1" modulate="true"/><!-- 文件大小 --><SizeBasedTriggeringPolicy size="100 MB"/></Policies></RollingFile></Appenders><Loggers><Root level="debug"><AppenderRef ref="Console"/><AppenderRef ref="debug_appender"/><AppenderRef ref="info_appender"/><AppenderRef ref="error_appender"/></Root></Loggers>
</Configuration>

打完收工。


http://www.ppmy.cn/embedded/125121.html

相关文章

pygame--超级马里奥(万字详细版)

超级马里奥点我下载https://github.com/marblexu/PythonSuperMario 1.游戏介绍 小时候的经典游戏&#xff0c;代码参考了github上的项目Mario-Level-1&#xff0c;使用pygame来实现&#xff0c;从中学习到了横版过关游戏实现中的一些处理方法。原项目实现了超级玛丽的第一个小…

vue2与vue3知识点

1.vue2&#xff08;optionsAPI&#xff09;选项式API 2.vue3&#xff08;composition API&#xff09;响应式API vue3 setup 中this是未定义&#xff08;undefined&#xff09;vue3中已经开始弱化this vue2通过this可以拿到vue3setup定义得值和方法 setup语法糖 ref > …

湖南(消费者调研)源点咨询 市场调研中关于定性调研的释义

湖南&#xff08;市场洞察&#xff09;源点咨询认为&#xff1a;定性调研是有关大量、详细信息的描述、领会和见解&#xff0c;而不仅仅是一种测量。它不像定量调研那么肤浅&#xff0c;它能提供更多有效的数据。定性调研旨在透过表面现象&#xff0c;超越所谓的"首要&quo…

使用代理服务器进行跨域可能引发的问题

在项目中使用代理服务器进行反向代理来解决跨域问题时&#xff0c;虽然能够有效地处理跨域请求&#xff0c;但仍有一些安全隐患。 1. 未授权访问 反向代理服务器可能会暴露内部的 API 和服务器资源。如果没有适当的访问控制机制&#xff0c;未经授权的用户可能通过代理访问敏…

大数据ETL数据提取转换和加载处理

什么是 ETL&#xff1f; 提取转换加载&#xff08;英语&#xff1a;Extract, transform, load&#xff0c;简称ETL&#xff09;&#xff0c;用来描述将资料从来源端经过抽取、转置、加载至目的端的过程。ETL一词较常用在数据仓库&#xff0c;但其对象并不限于数据仓库。 ETL&…

博弈_动态规划,递归与模拟

一&#xff1a;动态规划 题目链接&#xff1a;486. 预测赢家 - 力扣&#xff08;LeetCode&#xff09; 总体思路是使用动态规划&#xff08;DP&#xff09;的方法来解决一个两人轮流从数组的两端取数&#xff0c;并计算最终得分差的问题。动态规划是一种将复杂问题分解成更小…

Linux线程(七)线程安全详解

当我们编写的程序是一个多线程应用程序时&#xff0c;就不得不考虑到线程安全的问题&#xff0c;确保我们编写的程序是一个线程安全&#xff08;thread-safe&#xff09;的多线程应用程序&#xff0c;什么是线程安全以及如何保证线程安全&#xff1f;带着这些问题&#xff0c;本…

STM32(十八):SPI通信

SPI通信&#xff1a; SPI&#xff08;Serial Peripheral Interface&#xff09;是由Motorola公司开发的一种通用数据总线 四根通信线&#xff1a;SCK&#xff08;Serial Clock&#xff09;、MOSI&#xff08;Master Output Slave Input&#xff09;主机输出从机输入、MISO&…