SpringBoot第8讲:SpringBoot添加Logback日志

news2024/9/25 13:25:01

SpringBoot第8讲:SpringBoot添加Logback日志

本文是SpringBoot第8讲,对SpringBoot添加Logback日志。SpringBoot开发中如何选用日志框架呢? 出于性能等原因,Logback 目前是springboot应用日志的标配; 当然有时候在生产环境中也会考虑和三方中间件采用统一处理方式。

文章目录

  • SpringBoot第8讲:SpringBoot添加Logback日志
    • 1、日志框架的基础
      • 1.1、关于日志框架(日志门面)
      • 1.2、配置时考虑点
    • 2、实现范例
      • 2.1、综合范例
      • 2.2、在配置前可以参考如下文章
      • 2.3、商品中心配置示例
      • 2.4、白龙马配置示例
    • 3、参考文档

1、日志框架的基础

在学习这块时需要一些日志框架的发展和基础,同时了解日志配置时考虑的因素。

1.1、关于日志框架(日志门面)

Java日志库是最能体现Java库在进化中的渊源关系的,在理解时重点理解日志框架本身日志门面,以及比较好的实践等。要关注其历史渊源和设计(比如桥接),而具体在使用时查询接口即可,否则会陷入JUL(Java Util Log), JCL(Commons Logging), Log4j, SLF4J, Logback,Log4j2 傻傻分不清楚的境地。

关于日志框架(日志门面)这篇文章有过详细的介绍。

开发工具篇第十四讲:日志类库详解

1.2、配置时考虑点

在配置日志时需要考虑哪些因素?

  • 支持日志路径,日志level等配置
    • <appender-ref ref="${log.appender.application}"/>
  • 日志控制配置通过application.yml下发
  • 按天生成日志,当天的日志>50MB回滚
  • 最多保存15天日志
  • 生成的日志中Pattern自定义
    • <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] [%traceId] %logger{5} - %msg%n</pattern>
  • Pattern中添加用户自定义的MDC字段,比如用户信息(当前日志是由哪个用户的请求产生),request信息。此种方式可以通过AOP切面控制,在MDC中添加requestID,在spring-logback.xml中配置Pattern。
  • 根据不同的运行环境设置Profile - dev,test,product
    • 例如:huxun.gateway.profile=dev
  • 对控制台,Err和全量日志分别配置
  • 对第三方包路径日志控制

2、实现范例

如下两个例子基本包含了上述的考虑点:

2.1、综合范例

  • application.yml
logging:
  level:
    root: debug
  path: C:/data/logs/springboot-logback-demo
server:
  port: 8080
spring:
  application:
    name: springboot-logback-demo
debug: false
  • Spring-logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <!-- 日志根目录-->
    <springProperty scope="context" name="LOG_HOME" source="logging.path" defaultValue="/data/logs/springboot-logback-demo"/>

    <!-- 日志级别 -->
    <springProperty scope="context" name="LOG_ROOT_LEVEL" source="logging.level.root" defaultValue="DEBUG"/>

    <!--  标识这个"STDOUT" 将会添加到这个logger -->
    <springProperty scope="context" name="STDOUT" source="log.stdout" defaultValue="STDOUT"/>

    <!-- 日志文件名称-->
    <property name="LOG_PREFIX" value="spring-boot-logback" />

    <!-- 日志文件编码-->
    <property name="LOG_CHARSET" value="UTF-8" />

    <!-- 日志文件路径+日期-->
    <property name="LOG_DIR" value="${LOG_HOME}/%d{yyyyMMdd}" />

    <!--对日志进行格式化-->
    <property name="LOG_MSG" value="- | [%X{requestUUID}] | [%d{yyyyMMdd HH:mm:ss.SSS}] | [%level] | [${HOSTNAME}] | [%thread] | [%logger{36}] | --> %msg|%n "/>

    <!--文件大小,默认10MB-->
    <property name="MAX_FILE_SIZE" value="50MB" />

    <!-- 配置日志的滚动时间 ,表示只保留最近 10 天的日志-->
    <property name="MAX_HISTORY" value="10"/>

    <!--输出到控制台-->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!-- 输出的日志内容格式化-->
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>${LOG_MSG}</pattern>
        </layout>
    </appender>

    <!--输出到文件-->
    <appender name="0" class="ch.qos.logback.core.rolling.RollingFileAppender">
    </appender>

    <!-- 定义 ALL 日志的输出方式:-->
    <appender name="FILE_ALL" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--日志文件路径,日志文件名称-->
        <File>${LOG_HOME}/all_${LOG_PREFIX}.log</File>

        <!-- 设置滚动策略,当天的日志大小超过 ${MAX_FILE_SIZE} 文件大小时候,新的内容写入新的文件, 默认10MB -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--日志文件路径,新的 ALL 日志文件名称,“ i ” 是个变量 -->
            <FileNamePattern>${LOG_DIR}/all_${LOG_PREFIX}%i.log</FileNamePattern>

            <!-- 配置日志的滚动时间 ,表示只保留最近 10 天的日志-->
            <MaxHistory>${MAX_HISTORY}</MaxHistory>

            <!--当天的日志大小超过 ${MAX_FILE_SIZE} 文件大小时候,新的内容写入新的文件, 默认10MB-->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>

        <!-- 输出的日志内容格式化-->
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>${LOG_MSG}</pattern>
        </layout>
    </appender>

    <!-- 定义 ERROR 日志的输出方式:-->
    <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 下面为配置只输出error级别的日志 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <OnMismatch>DENY</OnMismatch>
            <OnMatch>ACCEPT</OnMatch>
        </filter>
        <!--日志文件路径,日志文件名称-->
        <File>${LOG_HOME}/err_${LOG_PREFIX}.log</File>

        <!-- 设置滚动策略,当天的日志大小超过 ${MAX_FILE_SIZE} 文件大小时候,新的内容写入新的文件, 默认10MB -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">

            <!--日志文件路径,新的 ERR 日志文件名称,“ i ” 是个变量 -->
            <FileNamePattern>${LOG_DIR}/err_${LOG_PREFIX}%i.log</FileNamePattern>

            <!-- 配置日志的滚动时间 ,表示只保留最近 10 天的日志-->
            <MaxHistory>${MAX_HISTORY}</MaxHistory>

            <!--当天的日志大小超过 ${MAX_FILE_SIZE} 文件大小时候,新的内容写入新的文件, 默认10MB-->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>

        <!-- 输出的日志内容格式化-->
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>${LOG_MSG}</Pattern>
        </layout>
    </appender>

    <!-- additivity 设为false, 则logger内容不附加至root,配置以配置包下的所有类的日志的打印,级别是 ERROR-->
    <logger name="org.springframework"     level="ERROR" />
    <logger name="org.apache.commons"      level="ERROR" />
    <logger name="org.apache.zookeeper"    level="ERROR"  />
    <logger name="com.alibaba.dubbo.monitor" level="ERROR"/>
    <logger name="com.alibaba.dubbo.remoting" level="ERROR" />

    <!-- ${LOG_ROOT_LEVEL} 日志级别 -->
    <root level="${LOG_ROOT_LEVEL}">

        <!-- 标识这个"${STDOUT}"将会添加到这个logger -->
        <appender-ref ref="${STDOUT}"/>

        <!-- FILE_ALL 日志输出添加到 logger -->
        <appender-ref ref="FILE_ALL"/>

        <!-- FILE_ERROR 日志输出添加到 logger -->
        <appender-ref ref="FILE_ERROR"/>
    </root>

</configuration>

Profile 相关的配置可以参考:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml" />
    
     <!-- roll by day -->
     <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">   
    	<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">   
      		<fileNamePattern>logs/springboot-logback-demo.%d{yyyy-MM-dd}.log</fileNamePattern>   
      		<maxHistory>30</maxHistory>  
    	</rollingPolicy>   
    	<encoder>   
      		<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg%n</pattern>   
    	</encoder>  
  	</appender> 
   
    <!-- dev -->
    <logger name="org.springframework.web" level="INFO"/>
      	<root level="INFO">
      	<appender-ref ref="FILE" />
    </root>

    <!-- test or production -->
    <springProfile name="test,prod">
        <logger name="org.springframework.web" level="INFO"/>
        <logger name="com.pdai.springboot" level="INFO"/>
        <root level="INFO">
        	<appender-ref ref="FILE" />
        </root>
    </springProfile>
  	 
</configuration>

商品中心的做法:

<!--将日志输出到控制台-->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>%date %5level %6relative --- [%15thread] [%-40logger{40}] [%C:%L] : [%X{traceId:-0}||%X{PtxId:-0}]
            %msg%n
        </pattern>
    </encoder>
</appender>

%date 2006-10-20 14:06:49,812

%5level 转换说明符 %5level 表示日志记录事件的级别应该左对齐到五个字符的宽度

%6relative 输出从应用程序启动到创建日志事件所经过的毫秒数。

[%15thread] 输出生成日志事件的线程的名称。

%-40logger{40} 日志记录

[%X{traceId:-0}||%X{PtxId:-0}]

  • 在这里插入图片描述

日志的使用

// case 1
@Slf4j
@Component
public class XxxProcessor {
   log.info("Xxx.getByIds response={}", JsonUtils.toJson(response));
}

// case 2
public class XxxUtils {
    private static final Logger logger = LoggerFactory.getLogger(XxxUtils.class);
  	logger.error("", e);
}

2.2、在配置前可以参考如下文章

logback的使用和logback.xml详解

2.3、商品中心配置示例

  • application.yml
apollo:
  bootstrap:
    enabled: true
    namespaces: application,dev.common,dev.drds-common
spring:
  application:
    name: item-platform-center
application:
  name: item-platform-center
dubbo:
  name: item-platform-center
  provider:
    filter: dubboMonitor
management:
  health:
    elasticsearch:
      enabled: false
# mybatis-plus配置   多数据源不生效,全部移到BaseSourceConfig和OtherSourceConfig
mybatis-plus:
  # Mapper 所对应的 XML 文件位置
  #mapper-locations: classpath*:/mapper/**/*Mapper.xml
  # 实体类根路径
  #type-aliases-package: cn.gov.zcy.service.domain.dto
  # 配置超类,如果配置了该属性,则仅仅会扫描路径下以该类作为父类的域对象
  #type-aliases-super-type: cn.gov.zcy.service.domain.BaseEntity
  configuration:
    # 日志打印,需要集成扩展虚竹插件
    # log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    # 开启驼峰功能
    # map-underscore-to-camel-case: true
    # 二级缓存
    cache-enabled: false
    # 关闭一级缓存
    local-cache-scope: statement
  global-config:
    # banner 取消
    banner: false
    # db 配置
    db-config:
      # id 生成策略
      id-type: auto
  # 加入自己的typehandler
  #type-handlers-package: cn.gov.zcy.item.infra.db.type.handlers
elasticjobs: []
  • logback-spring.xml

  • <?xml version="1.0" encoding="UTF-8" ?>
    <configuration>
        <property name="APP_NAME" value="item-platform-center"/>
        <property name="level" value="${logLevel:-info}"/>
        <property name="mapperLevel" value="${mapperLogLevel:-info}"/>
        <property name="tag" value="${tags:-default}"/>
        <property name="rLogIp" value="${rLogIp:-127.0.0.1}"/>
        <property name="rLogPort" value="${rLogPort:-00}"/>
    
        <logger name="org.springframework.web" level="INFO"/>
        <logger name="org.reflections.Reflections" level="ERROR"/>
        <logger name="org.apache.dubbo" level="ERROR"/>
        <logger name="cn.gov.zcy.dubbo.filter" level="ERROR"/>
        <logger name="cn.gov.zcy.spi.framework.aop.SpiExecutionAspect" level="WARN"/>
        <logger name="cn.gov.zcy.spi.framework.SpiProviderManager" level="WARN"/>
        <logger name="cn.gov.zcy.zmq.core.ons" level="WARN"/>
        <logger name="cn.gov.zcy.zmq.util.DefaultZMQTemplate" level="WARN"/>
        <logger name="MySQL" level="WARN"/>
        <logger name="com.zaxxer.hikari.HikariDataSource" level="WARN"/>
        <logger name="cn.gov.zcy.itemplatform.infra.db.mapper" level="${mapperLevel}"/>
    
        <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
                <pattern>%date %5level %6relative --- [%15thread] [%-40logger{40}] [%C:%L] : [%X{traceId:-0}||%X{PtxId:-0}] %X{biz} %msg%n</pattern>
            </encoder>
        </appender>
    
        <root level="${level}">
            <appender-ref ref="CONSOLE"/>
        </root>
    
        <logger name="io.terminus.license" level="OFF"/>
        <logger name="io.terminus.pampas.webc.controller" level="OFF"/>
    </configuration>
    

2.4、白龙马配置示例

logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
    <conversionRule conversionWord="traceId" converterClass="com.huxun.agent.finance.util.TraceIdConverter"/>

  	<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
    <property name="BASE_DIR" value="${log.dir}"/>
    <property name="LOG_PATH" value="${BASE_DIR}/server/logs"/>

    <!-- 控制台输出 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] [%traceId] %logger{5} - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="APPLICATION" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_PATH}/application.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
          	<!--日志文件输出的文件名-->
            <FileNamePattern>${LOG_PATH}/application.log.%d{yyyy-MM-dd}.%i</FileNamePattern>
	          <!--日志文件保留天数-->
            <MaxHistory>7</MaxHistory>
	          <!--日志文件最大的大小-->
            <maxFileSize>1GB</maxFileSize>
            <totalSizeCap>40GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] [%traceId] %logger{5} - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

	  <!-- 日志输出级别 -->
    <root level="INFO">
        <appender-ref ref="${log.appender.application}"/>
    </root>
</configuration>

3、参考文档

  • Logback官网

  • Logback官网 文档

  • Logback中 Encoder Pattern

<encoder>
		<pattern>%d{HH:mm:ss} [%thread][%X{traceId}] %-5level %logger{36} - %msg%n</pattern>
</encoder>

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

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

相关文章

身份证真伪一键验证API接口 - 通过OCR技术快速识别和验证身份证信息

身份证是我们日常生活中必不可少的证件&#xff0c;但是在实际使用中&#xff0c;我们也会遇到很多问题&#xff0c;例如身份证是否真实有效&#xff0c;身份证信息是否准确等等。这时候我们就需要用到一种能够快速识别和验证身份证信息的技术——OCR&#xff08;Optical Chara…

python怎么实现tcp和udp连接

目录 什么是tcp连接 什么是udp连接 python怎么实现tcp和udp连接 什么是tcp连接 TCP&#xff08;Transmission Control Protocol&#xff09;连接是一种网络连接&#xff0c;它提供了可靠的、面向连接的数据传输服务。 在TCP连接中&#xff0c;通信的两端&#xff08;客户端和…

学习笔记|大模型优质Prompt开发与应用课(二)|第二节:超高产文本生成机,传媒营销人必备神器

文章目录 01 文字写作技能的革新&#xff0c;各行各业新机遇四大类常见文字工作新闻记者的一天新闻记者的一天–写策划prompt 新闻记者的一天–排采访prompt生成结果prompt生成结果 大模型加持&#xff0c;文字写作我们如何提效营销创作营销创作-使用预置法为不同平台生成文案p…

【机器学习】机器学习中的“本体”概念

一、说明 在机器学习中&#xff0c;本体越来越多地用于提供基于相似性分析和场景知识的 ML 模型。 在传统的基于标签的定义中&#xff0c;对象往往是孤立的&#xff0c;可扩展性差&#xff0c;存在重复的可能性&#xff0c;对象之间的关系无法体现。在基于本体的定义中&#xf…

​语言模型输出端共享Embedding的重新探索

©PaperWeekly 原创 作者 | 苏剑林 单位 | 科学空间 研究方向 | NLP、神经网络 预训练刚兴起时&#xff0c;在语言模型的输出端重用 Embedding 权重是很常见的操作&#xff0c;比如 BERT、第一版的 T5、早期的 GPT&#xff0c;都使用了这个操作&#xff0c;这是因为当模型…

每天一个电商API分享:获取淘宝商品sku接口

SKU通俗来讲就是一个产品最小的出库单位&#xff0c;比如说一款手机产品有红黑白三个颜色&#xff0c;那么一台红色手机就是一个sku。那么多销售属性的产品&#xff0c;再往下分&#xff0c;比如说一件T恤除了有颜色还有尺码&#xff0c;那么一件s码绿色体恤就是单个sku。 sku指…

数据学习教程:Linux基础教程(下)

本文继上一篇《Linux基础教程&#xff08;上&#xff09;》的下一篇&#xff0c;欢迎收藏。 4 Linux常用基础命令 Linux刚面世时并没有图形界面, 所有的操作全靠命令完成, 如磁盘操作、文件存取、目录操作、进程管理、文件权限设定等 在职场中&#xff0c;大量的服务器维护工作…

C盘满了怎么清理?最全c盘清理攻略!

“c盘怎么会那么容易满啊&#xff1f;而且每次清理好像也释放不了多少空间。谁懂啊&#xff1f;一天要清理好几次c盘&#xff01;真的很麻烦。有谁能告诉我应该怎么做吗&#xff01;” 电脑c盘对我们来说真的是很重要。当我们在电脑上安装软件、存储文件或者浏览网站&#xff0…

提升打印品质:解决Excel表格乱套问题的实用技巧

作为办公人员&#xff0c;我们经常需要打印大量的数据表格。然而&#xff0c;打印表格并不是一件简单的事情&#xff0c;如果不注意&#xff0c;打印效果可能会变得混乱不堪。那么该怎么办呢&#xff1f;在这里&#xff0c;我将为大家分享9个关于Excel表格打印的技巧&#xff0…

django自定义app,创建子应用

1.工程里创建apps包 &#xff1b; 2.创建子应用&#xff0c;pycharm terminal 运行&#xff1a;python ./nanage.py startapp app名称&#xff1b; 3.子应用移动到apps包里&#xff1b; 4.settings.py里设置INSTALLED_APPS如“apps.users”&#xff0c;该名字跟子应用apps.py文…

KBYCMS框架后台使用帮助介绍

后台入口文件 后台入口文件默认是public目录下的admin.php。访问后台时加上admin.php访问,您可根据需要,重命名后台入口文件。 重命名后需要在config/app.php文件中修改配置,配置如下,如果没有以下配置那么该版本无需理会。 // 入口文件绑定,无需写index app_file …

Fastjson远程命令执行漏洞总结

## 1.FastJson 简介 ##### fastjson.jar包原始下载地址&#xff1a;https://github.com/alibaba/fastjson ##### fastjson用于将Java Bean序列化为JSON字符串&#xff0c;也可以从JSON字符串反序列化到JavaBea... 1.FastJson 简介 fastjson.jar包原始下载地址&#xff1a;Git…

设计模式-模版方法模式

生活中处处存在模版&#xff0c;模版定义了大的框架&#xff0c;具体内容由使用者填充即可&#xff0c;这给很多人的生活、工作带来了很大的遍历。比如&#xff1a; PPT模版&#xff1a;好的PPT模版提供了更全面的叙述框架&#xff0c;更优美的UI画面&图标&#xff0c;提升…

算法训练营第五十一天||309.最佳买卖股票时机含冷冻期 ● 714.买卖股票的最佳时机含手续费 ●总结

309.最佳买卖股票时机含冷冻期 这道题主要就是搞懂dp数组含义以及状态之间的转换&#xff0c;没看答案能自己做出来 class Solution { public:int maxProfit(vector<int>& prices) {vector<vector<int>> dp(prices.size(),vector<int>(5,0));//前…

jMeter使用随记

参数化BodyData 先制作参数文件 再设置一个csv data set config 最后在body data里面写上参数${xxxxx}

【外卖系统】更新员工信息

需求分析 员工管理列表界面&#xff0c;需要对某个员工的账号进行启用和禁用操作。账号禁用的员工不能登录系统&#xff0c;启用后的员工可以正常登录。只有admin可以对其他普通用户进行启用、禁用的操作&#xff0c;普通用户登录系统后启动、禁用按钮都是不显示的编辑员工信息…

家庭有必要买洗地机吗、洗地机排行榜推荐

洗地机相信大家都认识吧&#xff0c;在清洁家电领域这可谓是个“名人”。在清洁工具的名单中&#xff0c;要说一机多用&#xff0c;使用体验好的&#xff0c;洗地机绝对名列前茅。和传统清洁工具相比&#xff0c;洗地机可以很快速的就清洁干净地面&#xff0c;十多分钟就能还你…

数据库—用户权限管理(三十三)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、概述 二、用户权限类型 ​三、用户赋权 四、权限删除 五、用户删除 前言 数据库用户权限管理是指对数据库用户的权限进行控制和管理&#xff0c;确保用户只能执…

探究Spring Bean的六种作用域:了解适用场景和使用方式

这里写目录标题 单例&#xff08;Singleton&#xff09;作用域&#xff1a;原型&#xff08;Prototype&#xff09;作用域&#xff1a;请求&#xff08;Request&#xff09;作用域&#xff1a;会话&#xff08;Session&#xff09;作用域&#xff1a;全局&#xff08;applicati…

【一文搞懂】—带霍尔编码器的直流有刷减速电机

文章目录 一、直流有刷电机二、减速比三、霍尔编码器3.1 霍尔编码器3.2 霍尔编码器测速原理 四、测速程序设计4.1 跳变沿检测4.2 计算转速 一、直流有刷电机 宏观上说直流有刷电机由固定部分&#xff08;定子&#xff09;和旋转部分&#xff08;转子&#xff09;组成。在定子上…