Java-日志技术大全

news2025/1/10 14:59:44

一:目录

1.jul的使用

2.log4j的使用

3.logback的使用

4.log4j2的使用

二:jul使用

jul是JDK自带的日志技术,不需要导入其他依赖,默认的级别为info

1.关键组件:

(1).Logger:记录器

(2).Handler:处理器

(3).Formatter:布局

2.代码中配置jul:

@Test
	public void julLogger() throws Exception {
		Logger logger=Logger.getLogger("com.wxy.example");
		logger.info("日志技术");
		logger.log(Level.INFO,"info级别");
		System.out.println("-------------------");
		//关闭系统默认配置
		logger.setUseParentHandlers(false);
		//自定义配置日志级别
		//创建ConsoleHandler
		ConsoleHandler consoleHandler=new ConsoleHandler();
		//创建简单格式转换对象
		SimpleFormatter simpleFormatter=new SimpleFormatter();
		//进行关联
		consoleHandler.setFormatter(simpleFormatter);
        consoleHandler.setLevel(Level.ALL);
		logger.addHandler(consoleHandler);
		//配置日志具体级别
		logger.setLevel(Level.ALL);
		logger.severe("错误信息");
		logger.warning("警告信息");
		logger.info("日志输出");
		logger.fine("fine");
		logger.finer("finer");
		logger.finest("finest");
	}

3.在配置文件中配置:

handlers= java.util.logging.ConsoleHandler
.level= ALL
java.util.logging.ConsoleHandler.level= ALL
java.util.logging.ConsoleHandler.formatter= java.util.logging.SimpleFormatter
java.util.logging.ConsoleHandler.encoding= UTF-8

java.util.logging.FileHandler.pattern= D:/\u4EE3\u7801/Logs/ssm-jul-java%u.log
java.util.logging.FileHandler.limit= 50000
java.util.logging.FileHandler.count= 1
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.FileHandler.append = true

文件名为logging.properties,配置了两种Handler,一种输出在控制台,一种输出在文件中。

@Test
	public void julLogger() throws Exception {
		InputStream                 
        inputStream=example.class.getClassLoader().
                    getResourceAsStream("logging.properties");
		LogManager logManager=LogManager.getLogManager();
		logManager.readConfiguration(inputStream);
		Logger logger=Logger.getLogger("com.wxy");
		logger.severe("错误信息");
		logger.warning("警告信息");
		logger.info("日志输出");
		logger.fine("fine");
		logger.finer("finer");
		logger.finest("finest");
	}

需要用到LogManager对象来读取配置文件。

4.slf4j与jul结合使用:

依赖:

    <dependency>
		<groupId>org.slf4j</groupId>
		<artifactId>slf4j-api</artifactId>
		<version>1.7.36</version>
	</dependency>
	
	<dependency>
		<groupId>org.slf4j</groupId>
		<artifactId>slf4j-jdk14</artifactId>
		<version>1.7.26</version>
	</dependency>

 注意添加依赖的版本不同问题。

public class test {
	private static final Logger LOGGER=LoggerFactory.getLogger(test.class);
	public static void main(String[] args) {
		//PropertyConfigurator.configure("src/main/resources/log4j.properties");
		LOGGER.error("错误信息");
		LOGGER.warn("警告信息");
		LOGGER.info("普通信息");
		LOGGER.debug("调试信息");
		LOGGER.trace("trace信息");
		String username="张三";
		String password="13579";
		LOGGER.info(username+password);
		LOGGER.info("zhuijia ");
	}
}

 使用slf4j门面技术,需要通过LoggerFactory.getLogger()方法获取Logger实例对象,使用的是slf4j   提供的自动配置,也可以添加logging.properties配置文件进行配置,slf4j可以自动识别并读取配置文件。

三:log4j的使用:

1.关键组件:

(1).loggers:日志记录器,遵循父继子承的关系。

(2).appender:输出控制器

        ConsoleAppender:输出位置为控制台;

        FileAppender:输出位置为文件;

        DailyRollingFileAppender:根据日期更新拆分日志文件;

        RollingFileAppender:根据大小拆分日志文件;

        JDBCAppender:输出位置为数据库。

(3).layout:输出格式

        HTMLLayout:输出HTML格式的数据;

        SimpleLayout:输出默认格式的数据;

        PatternLayout:自定义输出格式。

log4j的PatternLayout的常用占位符:

c	用于输出日志事件的类别。例如,对于类别名称"a.b.c",模式%c{2}将输出"b.c"。
C	用于输出发出日志记录请求的调用方的全限定类名。例如,对于类名"org.apache.xyz.SomeClass",模式%C{1}将输出"SomeClass"。
d	用于输出记录事件的日期。例如,%d{HH:mm:ss,SSS}或%d{dd MMM yyyy HH:mm:ss,SSS}。
F	用于输出发出日志请求的文件名。
l	用于输出生成日志事件的呼叫者的位置信息。
L	用于输出发出记录请求的行号。
m	用于输出与日志记录事件关联的应用程序提供的消息。
M	用于输出发出记录请求的方法名称。
n	输出平台相关的行分隔符或多个字符。
p	用于输出日志事件的优先级。
r	用于输出从布局的构造到创建日志记录事件所经过的毫秒数。
t	用于输出生成日志事件的线程的名称。
x	用于输出与生成日志事件的线程关联的NDC(嵌套诊断上下文)。
X	X转换字符后跟MDC的密钥。例如,X{clientIP}将根据密钥clientIP打印MDC中存储的信息。
​

2.使用默认配置:

@Test
	public void Log4jLogger() {
		BasicConfigurator.configure();
		Logger logger=Logger.getLogger("com.wxy.example");
			logger.fatal("fatal信息,危险信息!!!");
			logger.error("错误信息!!!");
			logger.warn("warn警告信息");
			logger.info("info普通信息");
			logger.debug("debug调试信息");
			logger.trace("trace信息");
			String nameString="zhangsan";
			logger.info("info信息"+nameString);
	}

使用默认配置时一定要加上BasicConfigurator.configure();

3.自定义配置:

log4j.rootLogger=INFO,console,dailyRollingFileAppender
#log4j.logger.com.wxy=INFO,console,logFile

log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%-10p] [%t] [%d{yyyy-MM-dd HH:mm:ss:SSS}] [%l] %m%n

log4j.appender.logFile=org.apache.log4j.FileAppender
log4j.appender.logFile.layout=org.apache.log4j.PatternLayout
log4j.appender.logFile.layout.ConversionPattern=[%-10p] [%t] [%d{yyyy-MM-dd HH:mm:ss:SSS}] [%l] %m%n
log4j.appender.logFile.File=D:/\u4EE3\u7801/Logs/ssm-log4j-java.log
log4j.appender.logFile.Encoding=UTF-8

log4j.appender.rollingFile=org.apache.log4j.RollingFileAppender
log4j.appender.rollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.rollingFile.layout.conversionPattern=[%-10p] [%t] [%d{yyyy-MM-dd HH:mm:ss:SSS}] [%l] %m%n
log4j.appender.rollingFile.File=D:/\u4EE3\u7801/Logs/ssm-log4j-java.log
log4j.appender.rollingFile.Encording=UTF-8
log4j.appender.rollingFile.maxFileSize=10KB
log4j.appender.rollingFile.maxBackupIndex=5

log4j.appender.dailyRollingFileAppender=org.apache.log4j.DailyRollingFileAppender
log4j.appender.dailyRollingFileAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.dailyRollingFileAppender.layout.conversionPattern=[%-10p] [%t] [%d{yyyy-MM-dd HH:mm:ss:SSS}] [%l] %m%n
log4j.appender.dailyRollingFileAppender.File=D:/\u4EE3\u7801/Logs/log4j.log
log4j.appender.dailyRollingFileAppender.Encoding=UTF-8
log4j.appender.dailyRollingFileAppender.DatePattern='.'yyyy-MM-dd
@Test
	public void Log4jLogger() {
		Logger logger=Logger.getLogger("com.wxy.example");
			logger.fatal("fatal信息,危险信息!!!");
			logger.error("错误信息!!!");
			logger.warn("warn警告信息");
			logger.info("info普通信息");
			logger.debug("debug调试信息");
			logger.trace("trace信息");
			String nameString="zhangsan";
			logger.info("info信息"+nameString);
	}

log4j会自动识别并读取配置文件,不需要手动添加。

4.slf4j与log4j的结合使用:

依赖:

    <dependency>
		<groupId>org.slf4j</groupId>
		<artifactId>slf4j-api</artifactId>
		<version>1.7.36</version>
	</dependency>

	<dependency>
		<groupId>org.slf4j</groupId>
		<artifactId>slf4j-log4j12</artifactId>
		<version>1.7.36</version>
	</dependency>
	
	<dependency>
		<groupId>log4j</groupId>
		<artifactId>log4j</artifactId>
		<version>1.2.17</version>
	</dependency>

注意版本问题。

public class test {
	private static final Logger LOGGER=LoggerFactory.getLogger(test.class);
	public static void main(String[] args) {
		PropertyConfigurator.configure("src/main/resources/log4j.properties");
		LOGGER.error("错误信息");
		LOGGER.warn("警告信息");
		LOGGER.info("普通信息");
		LOGGER.debug("调试信息");
		LOGGER.trace("trace信息");
		String username="张三";
		String password="13579";
		LOGGER.info(username+password);
		LOGGER.info("zhuijia ");
	}
}

log4j.properties文件需要手动添加。

四:logback的使用:

logback通常与slf4j一块使用,默认级别为debug,可以使用异步日志。

1.依赖:

    <dependency>
		<groupId>org.slf4j</groupId>
		<artifactId>slf4j-api</artifactId>
		<version>1.7.36</version>
	</dependency>
	
	<dependency>
		<groupId>ch.qos.logback</groupId>
		<artifactId>logback-classic</artifactId>
		<version>1.2.11</version>
	</dependency>

添加slf4j-api和logback-classic依赖,添加了logback-classic会自动添加logback-core。

2.配置文件:

<configuration>
	<property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSSS} %c %M %L [%thread] %m%n"/>
	<property name="log_dir" value="D:/代码/Logs"/>
	<!-- 输出地址为控制台 -->
	<appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
		<!-- 控制输出流对象,默认System.out改为System.err,输出语句会变成红色的 -->
		<target>System.err</target>
		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
			<!-- 控制输出的格式 -->
			<pattern>${pattern}</pattern>
		</encoder>
	</appender>
	
	
	<!-- 输出地址为文件 -->
	<appender name="fileAppender" class="ch.qos.logback.core.FileAppender">
		<file>${log_dir}/logback.log</file>
		<append>true</append>
		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
			<!-- 控制输出的格式 -->
			<pattern>${pattern}</pattern>
		</encoder>
	</appender>
	
	
	<!-- 以HTML格式输出文件中 -->
	<appender name="fileHTMLAppender" class="ch.qos.logback.core.FileAppender">
		<file>${log_dir}/logback.html</file>
		<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
			<layout class="ch.qos.logback.classic.html.HTMLLayout">
				<pattern>${pattern}</pattern>
			</layout>
		</encoder>
	</appender>
	
	
	<!-- 按照每天生成日志文件 -->
    <appender name="APP_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件输出的文件名 -->
            <FileNamePattern>${log_dir}/error-%d{yyyy-MM-dd}.log</FileNamePattern>
            <!--日志文件保留天数 -->
            <MaxHistory>5</MaxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <!-- 此日志文件只记录error级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>error</level>
            <!-- 超过放行 -->
            <onMatch>ACCEPT</onMatch>
            <!-- 否则拦截 -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    
    
    <!-- 异步日志 -->
    <appender name="ASYNC_FILE" class="ch.qos.logback.classic.AsyncAppender">
    	<appender-ref ref="consoleAppender" />
	</appender>
	
	
	<root level="ALL">
		<appender-ref ref="consoleAppender"/>
		<appender-ref ref="fileAppender"/>
		<appender-ref ref="fileHTMLAppender"/>
	</root>
	
	<!-- 自定义logger additivity属性是否继承root属性 -->
	<logger name="com.wxy" level="ALL" additivity="false">
		<appender-ref ref="consoleAppender"/>
		<appender-ref ref="APP_ERROR"/>
	</logger>
</configuration>

3.测试: 

public class test {
	private static final Logger LOGGER=LoggerFactory.getLogger(test.class);
	public static void main(String[] args) {
		LOGGER.error("错误信息");
		LOGGER.warn("警告信息");
		LOGGER.info("普通信息");
		LOGGER.debug("调试信息");
		LOGGER.trace("trace信息");
		String username="张三";
		String password="13579";
		LOGGER.info(username+password);
		LOGGER.info("zhuijia ");
	}
}

五:log4j2的使用:

log4j2既包含了日志门面也包含了日志技术。但现在最主流的还是slf4j+log4j2的日志框架技术。

log4j2的PatternLayout的常用占位符:

- %m:输出日志消息(message)。 
- %n:换行符。 
- %c{10}:输出Logger的名称,最多显示10个字符。 
- %l:输出日志事件的位置信息,包括类名、方法名、行号等。 
- %C{1}:输出Logger的类名的最后一个元素(不包括包路径)。 
- %L:输出日志事件所在的行号。 
- %M:输出调用日志事件的方法名。 
- %d:输出日志时间日期。 
- %p:输出日志级别。 
- %t:输出线程名。 
- %r:输出自应用启动到输出该日志信息耗费的时间。 
- %x:输出线程上下文信息。 
- %X{key}:输出指定key的MDC(Mapped Diagnostic Context)信息。 
- %throwable:输出异常信息。 
- %highlight{level}:根据日志级别高亮显示日志消息。

1.依赖:

    <dependency>
		<groupId>org.apache.logging.log4j</groupId>
		<artifactId>log4j-slf4j-impl</artifactId>
		<version>2.17.1</version>
	</dependency>
	<dependency>
		<groupId>org.apache.logging.log4j</groupId>
		<artifactId>log4j-core</artifactId>
		<version>2.17.1</version>
	</dependency>
	<dependency>
		<groupId>com.lmax</groupId>
		<artifactId>disruptor</artifactId>
		<version>3.4.2</version>
	</dependency>

2.配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<!-- status="warn" 日志框架本身的输出日志级别 
	 monitorInterval="5" 自动加载配置文件的间隔时间,不低于5秒
-->
<configuration status="warn" monitorInterval="5">
	<properties>
		<property name="LOG_HOME">D:/代码/Logs</property>
		<property name="consolePattern">%d{HH:mm:ss.SSS} [%t] [%-5level] %c{36}:%l --- %m%n</property>
		<property name="filePattern">[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %l %c{36} - %m%n</property>
	</properties>
	<appenders>
		<Console name="Console" target="SYSTEM_OUT">
			<PatternLayout pattern="${consolePattern}"/>
		</Console>
		<!-- 使用AsyncAppender异步,性能几乎无变化,不推荐使用 -->
		<!-- <Async name="Async">
			<AppenderRef ref="Console"/>
		</Async> -->
		<File name="file" filename="${LOG_HOME}/log4j2.log">
			<PatternLayout pattern="${filePattern}"/>
		</File>
		
		<!-- 使用随机读写流的日志文件输出appender,性能好 -->
		<RandomAccessFile name="accessFile" fileName="${LOG_HOME}/log4j2-myAcclog.log">
			<PatternLayout pattern="${filePattern}"></PatternLayout>
		</RandomAccessFile>
		
		<!-- 按照一定规则拆分日志文件的appender -->
		<RollingFile name="rollingFile" fileName="${LOG_HOME}/log4j2-myrollog.log"
					 filePattern="${LOG_HOME}/$${date:yyyy-MM-dd}/myrollog-%d{yyyy-MM-dd-HH-mm}-%i.log">
			<!-- 日志级别过滤器 -->		 
			<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
			<!-- 日志消息格式 -->
			<PatternLayout pattern="${filePattern}"/>
			<Policies>
				<!-- 在系统启动时,触发拆分规则,生成一个新的日志文件 -->
				<!-- <OnStartupTriggeringPolicy /> -->
				<!-- 按照文件大小进行拆分 -->
				<SizeBasedTriggeringPolicy size="10 MB"/>
				<!-- 按照时间节点进行拆分 -->
				<TimeBasedTriggeringPolicy />
			</Policies>			
			<!-- 在同一个目录下,文件的个数限定为30个,超过进行覆盖 -->
			<DefaultRolloverStrategy max="30" />
		</RollingFile>
	</appenders>
	
	<loggers>
		<Root level="trace">
			<AppenderRef ref="Console" />
			<AppenderRef ref="file" />
			<AppenderRef ref="rollingFile" />
		</Root>
		<!-- 使用AsyncLogger混合异步日志 includeLocation属性:日志记录的行号信息 -->
		<AsyncLogger name="com.wxy" level="all" includeLocation="false" additivity="false">
			<AppenderRef ref="Console"/>
		</AsyncLogger>
	</loggers>
</configuration>

log4j2拥有多种异步日志的处理方式,主要分为AsyncLogger和AsyncApender。

AsyncApender异步日志的方式不建议使用,因为它和logback的性能差不多。

<Async name="Async">
    <AppenderRef ref="Console"/>
</Async>

在appenders标签中添加Async作为appender。

AsyncLogger提供了两种异步日志的方法,一种为全局异步,另一种为混合异步。

全局异步:在src/main/resources/下创建属性文件 log4j2.component.properties,在属性文件中添加如下即可,xml文件不做变化:

log4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector

混合异步:在log4j2.xml文件中的loggers属性中添加AsyncLogger。

<AsyncLogger name="com.wxy" level="all" includeLocation="false" additivity="false">
    <AppenderRef ref="Console"/>
</AsyncLogger>

3.测试: 

public class test {
	private static final Logger LOGGER=LoggerFactory.getLogger(test.class);
	public static void main(String[] args) {
		//PropertyConfigurator.configure("src/main/resources/log4j.properties");
		LOGGER.error("错误信息");
		LOGGER.warn("警告信息");
		LOGGER.info("普通信息");
		LOGGER.debug("调试信息");
		LOGGER.trace("trace信息");
		String username="张三";
		String password="13579";
		LOGGER.info(username+password);
		LOGGER.info("zhuijia ");
	}
}

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

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

相关文章

C#,图论与图算法,任意一对节点之间最短距离的弗洛伊德·沃肖尔(Floyd Warshall)算法与源程序

一、弗洛伊德沃肖尔算法 Floyd-Warshall算法是图的最短路径算法。与Bellman-Ford算法或Dijkstra算法一样&#xff0c;它计算图中的最短路径。然而&#xff0c;Bellman Ford和Dijkstra都是单源最短路径算法。这意味着他们只计算来自单个源的最短路径。另一方面&#xff0c;Floy…

为答疑机器人扩展问题分类与路由功能

1.意图识别 2. 构建路由模块 简单的意图识别 from chatbot import llmfrom config.load_key import load_key load_key()prompt 【角色背景】 你是一个问题分类路由器&#xff0c;需要识别问题的类型。 --- 【任务要求】 问题的类型目前有&#xff1a;公司内部文档查询、内…

spring boot启动源码分析(三)之Environment准备

上一篇《spring-boot启动源码分析&#xff08;二&#xff09;之SpringApplicationRunListener》 环境介绍&#xff1a; spring boot版本&#xff1a;2.7.18 主要starter:spring-boot-starter-web 本篇开始讲启动过程中Environment环境准备&#xff0c;Environment是管理所有…

Pandas-RFM会员价值度模型

文章目录 一. 会员价值度模型介绍二. RFM计算与显示1. 背景2. 技术点3. 数据4. 代码① 导入模块② 读取数据③ 数据预处理Ⅰ. 数据清洗, 即: 删除缺失值, 去掉异常值.Ⅱ. 查看清洗后的数据Ⅲ. 把前四年的数据, 拼接到一起 ④ 计算RFM的原始值⑤ 确定RFM划分区间⑥ RFM计算过程⑦…

【理论】测试框架体系TDD、BDD、ATDD、DDT介绍

一、测试框架是什么 测试框架是一组用于创建和设计测试用例的指南或规则。框架由旨在帮助 QA 专业人员更有效地测试的实践和工具的组合组成。 这些指南可能包括编码标准、测试数据处理方法、对象存储库、存储测试结果的过程或有关如何访问外部资源的信息。 A testing framewo…

FreeU: Free Lunch in Diffusion U-Net 笔记

FreeU: Free Lunch in Diffusion U-Net 摘要 作者研究了 U-Net 架构对去噪过程的关键贡献&#xff0c;并发现其主干部分主要在去噪方面发挥作用&#xff0c;而其跳跃连接主要是向解码器模块引入高频特征&#xff0c;这使得网络忽略了主干部分的语义信息。基于这一发现&#…

JAVA 使用apache poi实现EXCEL文件的输出;apache poi实现标题行的第一个字符为红色;EXCEL设置某几个字符为别的颜色

设置输出文件的列宽&#xff0c;防止文件过于丑陋 Sheet sheet workbook.createSheet(FileConstants.ERROR_FILE_SHEET_NAME); sheet.setColumnWidth(0, 40 * 256); sheet.setColumnWidth(1, 20 * 256); sheet.setColumnWidth(2, 20 * 256); sheet.setColumnWidth(3, 20 * 25…

【STM32】无源蜂鸣器播放音乐《千与千寻》,HAL库

目录 一、工程链接 二、简单介绍 主要特点&#xff1a; 应用&#xff1a; 驱动电路&#xff1a; 三、原理图 四、cubeMX配置 时钟配置 五、keil配置 六、驱动编写 演奏函数 主函数编写 七、效果展示 八、驱动附录 music.h music.c 一、工程链接 STM32无源蜂鸣…

在 Vue 3 集成 e签宝电子合同签署功能

实现 Vue 3 e签宝电子合同签署功能&#xff0c;需要使用 e签宝提供的实际 SDK 或 API。 e签宝通常提供针对不同平台&#xff08;如 Web、Android、iOS&#xff09;的 SDK&#xff0c;而 Web 端一般通过 WebView 或直接使用嵌入式 iframe 来加载合同签署页面。 下面举个 &…

04、Redis深入数据结构

一、简单动态字符串SDS 无论是Redis中的key还是value&#xff0c;其基础数据类型都是字符串。如&#xff0c;Hash型value的field与value的类型&#xff0c;List型&#xff0c;Set型&#xff0c;ZSet型value的元素的类型等都是字符串。redis没有使用传统C中的字符串而是自定义了…

如何用Python编程实现自动整理XML发票文件

传统手工整理发票耗时费力且易出错&#xff0c;而 XML 格式发票因其结构化、标准化的特点&#xff0c;为实现发票的自动化整理与保存提供了可能。本文将详细探讨用python来编程实现对 XML 格式的发票进行自动整理。 一、XML 格式发票的特点 结构化数据&#xff1a;XML 格式发票…

Linux——修改USB网卡设备节点名称

修改驱动&#xff1a; 测试&#xff1a; 参考资料&#xff1a; https://blog.csdn.net/ablexu2018/article/details/144868950

(STM32笔记)十二、DMA的基础知识与用法 第三部分

我用的是正点的STM32F103来进行学习&#xff0c;板子和教程是野火的指南者。 之后的这个系列笔记开头未标明的话&#xff0c;用的也是这个板子和教程。 DMA的基础知识与用法 三、DMA程序验证1、DMA 存储器到存储器模式实验&#xff08;1&#xff09;DMA结构体解释&#xff08;2…

论文笔记(六十一)Implicit Behavioral Cloning

Implicit Behavioral Cloning 文章概括摘要1 引言2 背景&#xff1a;隐式模型的训练与推理3 隐式模型与显式模型的有趣属性4 policy学习成果5 理论见解&#xff1a;隐式模型的通用逼近性6 相关工作7 结论 文章概括 引用&#xff1a; inproceedings{florence2022implicit,titl…

高斯函数Gaussian绘制matlab

高斯 约翰卡尔弗里德里希高斯&#xff0c;&#xff08;德语&#xff1a;Johann Carl Friedrich Gau&#xff0c;英语&#xff1a;Gauss&#xff0c;拉丁语&#xff1a;Carolus Fridericus Gauss&#xff09;1777年4月30日–1855年2月23日&#xff0c;德国著名数学家、物理学家…

vue的路由守卫逻辑处理不当导致部署在nginx上无法捕捉后端异步响应消息等问题

近期对前端的路由卫士有了更多的认识。 何为路由守卫&#xff1f;这可能是一种约定俗成的名称。就是VUE中的自定义函数&#xff0c;用来处理路由跳转。 import { createRouter, createWebHashHistory } from "vue-router";const router createRouter({history: cr…

如何在 Ubuntu 22.04 上使用 LEMP 安装 WordPress 教程

简介&#xff1a; 本教程旨在指导你如何在 Ubuntu 22.04 上使用 LEMP 栈安装 WordPress。 WordPress 是一个用 PHP 编写的开源内容管理系统。LEMP 栈是 Linux&#xff0c;NGINX&#xff0c;MySQL 和 PHP 的缩写。WordPress 非常用户友好&#xff0c;并提供了多种选项&#xff…

PySide6基于QSlider实现QDoubleSlider

我在写小工具的时候&#xff0c;需要一个支持小数的滑动条。 我QSpinBox都找到了QDoubleSpinBox&#xff0c;QSlider愣是没找到对应的东西。 网上有好多对QSlider封装实现QDoubleSlider的文章。 似乎Qt真的没有这个东西&#xff0c;需要我们自行实现。 于是我也封装了一个&…

升级 Spring Boot 3 配置讲解 —— 支持断点传输的文件上传和下载功能

学会这款 &#x1f525;全新设计的 Java 脚手架 &#xff0c;从此面试不再怕&#xff01; 在现代 Web 应用中&#xff0c;文件上传和下载是非常常见的需求。然而&#xff0c;当文件较大时&#xff0c;传统的上传下载方式可能会遇到网络不稳定或传输中断的问题。为了解决这些问题…

Backend - C# EF Core 执行迁移 Migrate

目录 一、创建Postgre数据库 二、安装包 &#xff08;一&#xff09;查看是否存在该安装包 &#xff08;二&#xff09;安装所需包 三、执行迁移命令 1. 作用 2. 操作位置 3. 执行&#xff08;针对visual studio&#xff09; 查看迁移功能的常用命令&#xff1a; 查看…