Log4j的原理及应用详解(四)
本系列文章简介:
在软件开发的广阔领域中,日志记录是一项至关重要的活动。它不仅帮助开发者追踪程序的执行流程,还在问题排查、性能监控以及用户行为分析等方面发挥着不可替代的作用。随着软件系统的日益复杂,对日志管理的需求也日益增长,因此,一个高效、灵活且易于使用的日志框架成为了每个开发团队的必备工具。
Log4j,作为Apache软件基金会下的一个开源项目,自诞生以来就凭借其强大的功能和灵活的配置方式,成为了Java世界中最为流行的日志框架之一。它不仅提供了丰富的日志记录级别,允许开发者根据需求精确地控制日志信息的输出,还通过其独特的Appender和Layout机制,实现了日志信息到不同目标(如控制台、文件、数据库等)的灵活输出,并允许用户自定义输出格式,极大地满足了各种复杂场景下的日志管理需求。
然而,Log4j之所以能够在众多日志框架中脱颖而出,不仅仅是因为其强大的功能,更在于其背后所蕴含的深刻设计理念和思想。Log4j通过其独特的Logger层次结构,实现了日志信息的有效组织和继承,使得开发者能够在复杂的软件系统中轻松管理大量的日志记录器。同时,Log4j还提供了灵活的配置机制,允许开发者通过简单的配置文件来定义日志记录的行为,极大地简化了日志管理的工作流程。
本系列文章旨在深入剖析Log4j的原理及应用,通过对其核心组件、工作机制、配置方法以及应用场景的详细阐述,帮助大家全面了解Log4j这一强大日志框架的各个方面。我们将从Log4j的基本概念入手,逐步深入到其内部工作原理,探讨如何通过Log4j来实现高效、灵活的日志管理。同时,我们还将结合实际应用场景,展示Log4j在软件开发、系统运维、性能监控和故障排查等方面的广泛应用,以及如何通过Log4j来应对复杂应用环境中的挑战。
希望通过本系列文章的阐述,大家能够对Log4j有一个更加全面和深入的认识,从而在未来的软件开发和运维工作中,能够更加高效地利用Log4j这一强大工具,提升软件系统的稳定性和可维护性。
欢迎大家订阅《Java技术栈高级攻略》专栏(PS:近期会涨价),一起学习,一起涨分!
目录
第一章 引言
第二章 Log4j的应用
2.1 应用场景
1. 调试代码
2. 应用监控与性能分析
3. 安全审计
4. 故障排查
5. 异步日志记录
6. 插件支持与扩展
7. 跨平台与兼容性
2.2 配置实例
2.3 日志轮转与归档
1、日志轮转(Rolling)
配置实例
2、日志归档(Archiving)
归档策略
2.4 日志分析与可视化
1、日志分析
2、日志可视化
3、应用实例
第三章 Log4j的安全性与挑战
第四章 结论与展望
第五章、结语
第一章 引言
Log4j是Apache的一个开源项目,它是一个可靠、快速、灵活的日志框架(API),主要用于Java语言编写的应用程序中。始于1996年,作为记录E.U. SEMPER(Secure Electronic Marketplace for Europe)项目跟踪信息的API。经过大量的完善和蜕变,最终演进为Log4j。
本文将跟随《Log4j的原理及应用详解(三)》的进度,继续介绍Log4j。希望通过本系列文章的学习,您将能够更好地理解Log4j的内部工作原理,掌握Log4j的使用技巧,以及通过合理的设计完成最佳实践,充分发挥优化Log4j的潜力,为系统的高效运行提供有力保障。
第二章 Log4j的应用
2.1 应用场景
Log4j作为一个广泛使用的Java日志记录工具,其应用场景非常广泛。以下是Log4j的一些主要应用场景:
1. 调试代码
- 详细跟踪:在开发过程中,Log4j可以帮助开发人员详细跟踪程序的执行流程,通过输出不同级别的日志信息(如DEBUG、INFO等),帮助开发人员理解程序的运行状态和变量值。
- 快速定位问题:当程序出现错误或异常时,通过查看日志信息,开发人员可以快速定位问题的原因和位置,提高调试效率。
2. 应用监控与性能分析
- 运行状态监控:Log4j可以记录应用程序的关键操作日志,通过对这些日志的分析,可以了解应用程序的运行状态和性能瓶颈。
- 性能调优:基于日志记录的性能数据,开发人员可以对应用程序进行性能调优,提高系统的响应速度和吞吐量。
3. 安全审计
- 用户行为追踪:通过记录用户操作的日志,Log4j可以用于安全审计,追踪用户的行为轨迹,防止恶意操作和数据泄露。
- 异常行为检测:通过分析日志中的异常信息,可以及时发现并处理潜在的安全威胁,保障系统的安全性。
4. 故障排查
- 问题复现:当生产环境出现问题时,通过查看和分析日志信息,可以复现问题的发生过程,帮助开发人员快速定位问题原因。
- 解决方案验证:在解决问题后,通过日志信息验证解决方案的有效性,确保问题得到彻底解决。
5. 异步日志记录
- 提高性能:Log4j支持异步日志记录器,可以将日志消息放入一个队列中,然后由后台线程进行处理,避免阻塞应用程序的执行,从而提高系统性能。
6. 插件支持与扩展
- 功能扩展:Log4j提供了丰富的插件支持,可以扩展其功能,如支持邮件通知、日志归档等,满足不同的应用需求。
7. 跨平台与兼容性
- 跨平台支持:Log4j作为Java语言的一部分,具有良好的跨平台性,可以在不同的操作系统和环境中运行。
- 兼容性:随着Java语言的不断发展和更新,Log4j也进行了相应的升级和改进,以确保与最新的Java版本保持兼容。
综上所述,Log4j在软件开发过程中具有广泛的应用场景,包括调试代码、应用监控与性能分析、安全审计、故障排查、异步日志记录、插件支持与扩展以及跨平台与兼容性等方面。通过合理使用Log4j,开发人员可以更有效地管理日志信息,提高开发效率和系统性能。
2.2 配置实例
Log4j的应用配置实例可以通过一个具体的log4j.properties
配置文件来展示。以下是一个典型的Log4j配置实例,它展示了如何配置Log4j以将日志信息输出到控制台和文件,并设置了不同的日志级别和格式。
Log4j配置实例(log4j.properties
)
# 设置根Logger的级别和Appender log4j.rootLogger=DEBUG, stdout, file # 配置控制台Appender log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n # 配置文件Appender log4j.appender.file=org.apache.log4j.FileAppender log4j.appender.file.File=logs/app.log log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n # 配置日志级别(可选,如果需要在Appender级别上单独设置) # log4j.appender.stdout.Threshold=INFO # log4j.appender.file.Threshold=DEBUG # 禁用Log4j自身的日志(可选) log4j.debug=false # 配置自定义Logger(可选) # log4j.logger.com.example=INFO, customAppender # ...(自定义Appender的配置)
配置说明
- 根Logger配置:
log4j.rootLogger=DEBUG, stdout, file
:设置根Logger的级别为DEBUG,并指定了两个Appender:stdout(控制台输出)和file(文件输出)。
- 控制台Appender配置:
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
:指定stdout Appender的类型为ConsoleAppender。log4j.appender.stdout.Target=System.out
:设置输出目标为控制台的标准输出流。log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
:设置日志信息的布局方式为PatternLayout。log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
:定义日志信息的输出格式,包括时间戳、日志级别、类名、行号以及日志消息。
- 文件Appender配置:
log4j.appender.file=org.apache.log4j.FileAppender
:指定file Appender的类型为FileAppender。log4j.appender.file.File=logs/app.log
:设置日志文件的路径和名称。- 其余配置与控制台Appender类似,但输出目标为文件。
- 日志级别配置(可选):
- 可以在Appender级别上单独设置日志级别,如
log4j.appender.stdout.Threshold=INFO
,这将使得stdout Appender只输出INFO及以上级别的日志。
- 可以在Appender级别上单独设置日志级别,如
- 禁用Log4j自身的日志(可选):
log4j.debug=false
:设置为false以禁用Log4j自身的日志输出,减少日志噪音。
- 自定义Logger配置(可选):
- 可以为特定的包或类配置自定义Logger,并指定其级别和Appender。
这个配置实例展示了Log4j的基本配置方法,包括如何设置日志级别、Appender和Layout,以及如何禁用Log4j自身的日志输出。在实际应用中,可以根据需要调整配置以满足不同的日志记录需求。
2.3 日志轮转与归档
Log4j在日志管理中的应用中,日志轮转与归档是非常重要的功能,它们有助于有效地管理和存储大量的日志数据。以下是对Log4j的日志轮转与归档的详细解释和配置实例:
1、日志轮转(Rolling)
日志轮转是指当日志文件达到一定条件(如文件大小、时间间隔等)时,自动将当前日志文件进行重命名并归档,同时创建新的日志文件继续记录日志信息。Log4j通过RollingFileAppender或类似的Appender来实现日志轮转。
配置实例
在Log4j2中,可以通过在log4j2.xml
配置文件中设置RollingFileAppender
来实现日志轮转。以下是一个配置示例:
<Configuration status="WARN"> <Appenders> <RollingFile name="RollingFile" fileName="logs/app.log" filePattern="logs/app-%d{yyyy-MM-dd}.log"> <PatternLayout pattern="%d %-5level [%t] %logger{36} - %msg%n"/> <Policies> <TimeBasedTriggeringPolicy interval="1" modulate="true"/> </Policies> <DefaultRolloverStrategy max="20"/> </RollingFile> </Appenders> <Loggers> <Root level="info"> <AppenderRef ref="RollingFile"/> </Root> </Loggers> </Configuration>
在这个配置中:
fileName
属性指定了当前日志文件的名称。filePattern
属性定义了归档日志文件的命名规则,这里使用了%d{yyyy-MM-dd}
来按照日期进行轮转。TimeBasedTriggeringPolicy
是触发策略,interval="1"
表示每天轮转一次,modulate="true"
用于调整时间间隔,确保轮转时间的准确性。DefaultRolloverStrategy
的max="20"
属性指定了保留的归档文件数量上限为20。
2、日志归档(Archiving)
日志归档通常与日志轮转紧密相关,因为轮转后的日志文件往往需要进行归档处理。归档可以是简单的文件重命名和存储,也可以是进一步的压缩和移动到专门的存储位置。
归档策略
在Log4j2中,归档策略通常通过配置DefaultRolloverStrategy
、SizeBasedTriggeringPolicy
、TimeBasedTriggeringPolicy
等来实现。此外,还可以通过设置压缩动作(如GzCompressAction
或ZipCompressAction
)来在归档时对日志文件进行压缩。
<RollingFile name="RollingFileWithCompression" fileName="logs/app.log" filePattern="logs/app-%d{yyyy-MM-dd-HH-mm-ss}-%i.log.gz"> <PatternLayout pattern="%d %-5level [%t] %logger{36} - %msg%n"/> <Policies> <TimeBasedTriggeringPolicy interval="1" modulate="true"/> <SizeBasedTriggeringPolicy size="100MB"/> </Policies> <DefaultRolloverStrategy max="10"> <Actions> <GzCompressAction/> </Actions> </DefaultRolloverStrategy> </RollingFile>
在这个配置中,日志文件在达到100MB或每小时进行一次轮转,并使用Gzip进行压缩。归档文件保留数量上限为10。
结论
Log4j通过灵活的配置选项支持日志轮转与归档,帮助开发者有效地管理和存储日志数据。在实际应用中,可以根据项目需求选择合适的轮转策略和归档策略,以优化日志管理效率。
2.4 日志分析与可视化
Log4j在日志分析与可视化方面的应用是其强大功能的重要组成部分。以下是对Log4j在日志分析与可视化方面的详细阐述:
1、日志分析
-
灵活配置:
Log4j允许通过配置文件灵活地配置日志的传输目的地(如控制台、文件、数据库等)和输出格式。这使得日志信息可以被收集到不同的存储介质中,便于后续的分析处理。 -
多级别日志:
Log4j定义了多个日志级别(如OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、ALL),这些级别允许开发人员根据日志的重要性进行筛选和过滤。在日志分析过程中,可以根据需要选择不同级别的日志进行查看,从而快速定位问题。 -
易于集成:
Log4j作为Java社区广泛使用的日志框架,与各种Java应用程序集成方便。这意味着无论是大型企业级应用还是小型个人项目,都可以轻松地引入Log4j进行日志管理。 -
强大查询功能:
在收集到日志信息后,可以通过编写查询语句对日志进行检索和分析。例如,在阿里云文档(来源)中提到的示例,展示了如何通过查询语句统计错误日志最多的位置、各种日志级别的日志条数等。
2、日志可视化
-
可视化工具支持:
虽然Log4j本身是一个日志框架,不直接提供可视化功能,但它可以与各种日志可视化工具集成,如ELK Stack(Elasticsearch、Logstash、Kibana)、Splunk等。这些工具能够将Log4j产生的日志数据进行加工、处理和展示,以图表、仪表盘等形式呈现给用户。 -
实时监控:
通过可视化工具,可以实时监控应用程序的日志输出情况。当系统出现异常或错误时,可以立即在可视化界面中看到相关日志信息,便于快速响应和处理。 -
数据洞察:
日志可视化不仅限于简单的日志展示,还可以通过对日志数据的深入分析,发现系统的潜在问题、性能瓶颈等。例如,通过分析用户行为日志,可以了解用户的使用习惯和需求,为产品优化提供数据支持。
3、应用实例
以某电商公司为例,该公司可能希望通过Log4j和日志可视化工具来分析用户行为习惯数据(如登录方式、上线时间点及时长、浏览页面、页面停留时间等)、平台稳定性、系统报错、数据安全性等信息。具体步骤如下:
-
日志收集:
使用Log4j配置日志文件的存储位置和输出格式,将用户行为、系统操作等日志信息收集到指定位置。 -
日志传输:
通过Logstash等工具将日志文件传输到Elasticsearch等存储介质中。 -
日志分析:
利用Elasticsearch的查询和分析功能对日志数据进行处理和分析。 -
日志可视化:
使用Kibana等可视化工具将分析结果以图表、仪表盘等形式展示出来,便于开发人员和运营人员查看和分析。
通过以上步骤,该公司可以更加高效地管理日志信息,提升系统的稳定性和用户体验。
第三章 Log4j的安全性与挑战
详见《Log4j的原理及应用详解(五)》
第四章 结论与展望
详见《Log4j的原理及应用详解(五)》
第五章、结语
文章至此,已接近尾声!希望此文能够对大家有所启发和帮助。同时,感谢大家的耐心阅读和对本文档的信任。在未来的技术学习和工作中,期待与各位大佬共同进步,共同探索新的技术前沿。最后,再次感谢各位的支持和关注。您的支持是作者创作的最大动力,如果您觉得这篇文章对您有所帮助,请分享给身边的朋友和同事!
相关文章:
Log4j的原理及应用详解(四)
本系列文章简介: 在软件开发的广阔领域中,日志记录是一项至关重要的活动。它不仅帮助开发者追踪程序的执行流程,还在问题排查、性能监控以及用户行为分析等方面发挥着不可替代的作用。随着软件系统的日益复杂,对日志管理的需求也日…...
农田自动化闸门的结构组成与功能解析
在现代化的农业节水灌溉领域中,农田自动化闸门的应用越来越广泛。它集成了先进的技术,通过自动化控制实现水资源的精准调度和高效利用。本文将围绕农田自动化闸门的结构组成,详细介绍其各个部件的功能和特点。 农田自动化闸门主要由闸门控制箱…...
Python解释器:CPython 解释器
一、什么是python解释器 Python解释器是一种用于执行Python代码的程序。 它将Python源代码转换为机器语言或字节码,从而使计算机能够执行。 1.1 Python解释器分类 1、CPython CPython 是 Python 的主要实现,由 C 语言编写。大多数用户在日常开发中使…...
layui 让table里的下拉框不被遮挡
记录:layui 让table里的下拉框不被遮挡 /* 这个是让table里的下拉框不被遮挡 */ .goods_table .layui-select-title,.goods_table .layui-select-title input{line-height: 28px;height: 28px; }.goods_table .layui-table-cell {overflow: visible !important; }.…...
【性能优化】在大批量数据下使用 HTML+CSS实现走马灯,防止页面卡顿
切换效果 页面结构变化 1.需求背景 项目首页存有一个小的轮播模块,保密原因大概只能这么展示,左侧图片右侧文字,后端一次性返回几百条数据(开发环境下,生产环境只会更多).无法使用分页解决,前端需要懒加载防止页面卡顿 写个小demo演示,如下 2.解决思路 获取到数据后,取第一…...
https和http区别
1、安全性 HTTP信息是明文传输,而HTTPS则通过SSL/TLS协议进行加密传输,确保数据传输的安全性。HTTPS可以验证服务器身份,防止中间人攻击,保护数据的完整性和保密性。 2、端口号 HTTP默认使用80端口,而HTTPS默认使用…...
SD-AI大模型的安装
📑打牌 : da pai ge的个人主页 🌤️个人专栏 : da pai ge的博客专栏 ☁️宝剑锋从磨砺出,梅花香自苦寒来 ☁️运维工程师的职责:监…...
UDP-如何实现客户端与服务器端的通信(一对一、一对多、多对一、多对多之间的通信)
Java中提供了DatagramSocket来实现这个功能 1.服务器端的程序 创建Socket,监听6666端口读取来自客户端的“数据包”,创建数据包(通过DatagramPacket实现数据包的创建)接收数据包从数据包中,读取数据(通过recieve()接收数据和send()发送给数据) 代码如下…...
C++那些事之依赖注入
C那些事之依赖注入 最近星球里面有个小伙伴让更新一下依赖注入,于是写出了这篇文章,来从实际的例子讲解,本文会讲解一些原理与实现,完整的实现代码懒人版放在星球中,我们开始正文。 大纲: 直接依赖接口依赖…...
克隆的TrinityCore服务器网速慢卡顿问题的解决(未解决)
一台TrinityCore服务器,采用的是备份克隆安装的方式,在FreeBSD bhyve 中安装Ubuntu,安装细节见如下两篇文档:尝试在FreeBSD 的jail、bhyve里安装TrinityCore-CSDN博客 备份和镜像TrinityCore_魔兽世界 updating auth database...…...
独立站外链如何影响搜索引擎排名?
独立站的外链对搜索引擎排名有着非常重要的影响。简单来说,外链就像是别的网站对你的网站投的信任票。每一条外链都告诉搜索引擎:“这个网站的内容是有价值的,值得推荐。”因此,外链的数量和质量直接影响你的网站在搜索引擎中的排…...
java设计模式:03-04-装饰器模式
装饰器模式(Decorator Pattern) 装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许向一个现有的对象添加新的功能,同时又不改变其结构。装饰器模式通过创建一个装饰类来包装原有的类,…...
通过splunk web服务将服务器上文件下载到本地
1. 需求说明 工作中经常遇到需要将服务器上的文件下载到本地,但是由于各种网络环境限制,没办法使用winscp或者xftp工具,那么如何将服务器上的文件下载下来呢? 这里提供一种思路: 如果服务器上安装有web服务,可将待下…...
Node.js 路由
Node.js 路由 介绍 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,它允许开发者使用 JavaScript 编写服务器端代码。Node.js 的一个核心特性是其事件驱动和非阻塞 I/O 模型,这使得它非常适合处理高并发和 I/O 密集型的应用程序。在 Node.js 中,路由是指确定应…...
Adobe国际认证详解-网页设计认证专家行业应用场景解析
在当今数字化时代,网页设计已成为各行各业不可或缺的一环。而网页设计认证专家,作为经过Adobe国际认证体系严格考核的专业人才,正逐渐成为行业内炙手可热的存在。他们凭借深厚的网页设计理论基础和实践经验,为各行各业提供了高质量…...
ESC(ELectronic Stability Control,电子稳定控制系统)
ESC通过实时监测车辆的动态参数,以及车辆轮胎的实际运动状态,通过调节车辆制动系统和发动机输出力,使车辆在紧急或危险情况下保持稳定,防止侧滑和失控。 ESC组成部分 传感器:用于检测车辆的动态参数,如车…...
减分兔搜题-12123学法减分20题目及答案 #媒体#职场发展
对于即将参加驾驶考试的朋友来说,掌握一些经典题目和答案至关重要。今天,我就为大家带来了这样一份干货——20道驾驶考试题目和答案,助你轻松应对考试!这些题目不仅包括了考试中常考的内容,还有针对难点和重点的详细解…...
java用freemarker导出word
freemarker导出word 第一步、将word转换为xml格式第二步、将转换后的xml文件修改后缀为ftl后复制到项目 resources 目录下(可以自己新建一个文件夹放在文件夹中)第三步、格式化xml代码(如果问价太大可能会无法格式化)这时候需要在…...
CH01_WPF概述
第1章:WPF概述 本章目标 了解Windows图形演化了解WPF高级API了解分辨率无关性概念了解WPF体系结构了解WPF 4.5 WPF概述 欢迎使用 Windows Presentation Foundation (WPF) 桌面指南,这是一个与分辨率无关的 UI 框架,使用基于矢量的呈现引…...
秒懂设计模式--学习笔记(11)【结构型-享元模式】
目录 10、享元模式10.1 享元模式10.2 举例10.2.1 马赛克10.2.2 游戏地图(以草原地图作为范例) 10.3 总结 10、享元模式 10.1 享元模式 “享元”则是共享元件的意思享元模式的英文flyweight是轻量级的意思,这就意味着享元模式能使程序变得更…...
Python爬虫——1爬虫基础(一步一步慢慢来)
一、爬虫是什么? (spider) Python 爬虫是利用编程语言 Python 来获取互联网上的数据的技术。它可以自动化地访问网页、提取信息并进行数据处理。以下是Python爬虫的基础知识和步骤: 主要特点和功能: 自动化浏览&#…...
【js自学打卡9】抛出异常 / 幂计算 / 发布订阅 / map小知识点
1. 抛出异常的写法 抛出一个简单的字符串错误 throw Error2; // 抛出一个字符串抛出一个Error对象 throw new Error(出错了!);抛出一个自定义错误对象 function UserError(message) {this.message message;this.name "UserError"; } throw new User…...
ArcGIS Pro SDK (九)几何 7 多点
ArcGIS Pro SDK (九)几何 7 多点 文章目录 ArcGIS Pro SDK (九)几何 7 多点1 构造多点 - 从映射点的枚举2 构造多点 - 使用 MultipointBuilderEx3 修改多点的点4 从多点检索点、2D 坐标、3D 坐标 环境:Visual Studio 2…...
服务器注意事项
1. 远程服务器不允许关机,只能重启; 2. 重启服务器应关闭服务; 3. 不要在服务器访问高峰运行高负载命令; 4. 远程配置防火墙是不要把自己踢出服务器; 5. 制定合理的密码规范并定期更新; 6. 合理分配权…...
学生信息管理系统设计
学生信息管理系统的设计是一个综合性的项目,涉及到数据的存储、检索、更新和删除等基本操作,同时也需要考虑系统的易用性、安全性和扩展性。以下是一些关键步骤和要素,用于指导设计这样一个系统: 1. 需求分析 目标用户ÿ…...
Python求均值,方差,标准差
参考链接:变异系数(Coefficient of Variation,COV)和协方差(Covariance, Cov)-CSDN博客 参考链接:pandas中std和numpy的np.std区别_numpy pandas std-CSDN博客 在计算蛋白质谱数据中的每个蛋白对应的变异…...
DDei在线设计器-HTML渲染
Html渲染 HtmlViewer插件通过将一个外部DIV附着在图形控件上,从而改变原有图形的显示方式。允许使用者自己定义HTML通过HTML元素。本示例演示了通过Html来扩展渲染图形,从而获得更加丰富的图形展现。 通常情况下,我们创建的图形控件ÿ…...
【React Hooks原理 - useSyncExternalStore】
概述 在React项目中说到状态管理,我们第一时间想到的就是使用useState、useReducer这种Hooks来进行状态管理。但是这种是针对React内部的状态,如果有时候我们需要订阅外部的状态并影响React组件的更新的话,那通过这种内部状态管理API显然不能…...
C++STL初阶(7):list的运用与初步了解
在了解了vector之后,我们只需要简单学习List与vector不一样的接口即可 1.list的基本接口 1.1 iterator list中,与vector最大的区别就是迭代器由随机迭代器变成双向迭代器 string和vector中的迭代器都是随机迭代器,支持-等,而LIS…...
el-menu弹出菜单样式不生效
1. 使用 ruoyi 项目时出现的问题。 <template><el-menu:default-active"activeMenu":collapse"false":unique-opened"true"class"container":collapse-transition"true"mode"horizontal"><sideba…...
公司网站选择什么空间/免费代理浏览网页
大臣的旅费 时间限制:1.0s 内存限制:256.0MB问题描述很久以前,T王国空前繁荣。为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市。 为节省经费,T国的大臣们经过思考ÿ…...
wordpress跳转移动端模板/搜索引擎技巧
2、 新建test数据库,在test数据库中新建book_info表,结构如下: 并向表中插入两条记录,两条记录中image_path字段的值分别为a.jpg和e.jpg在网站中的路径。 3、 新建Gridview.aspx页面,通过GridView控件按照下面的格式显…...
长沙网站建设价格/网站设计与制作教程
2019独角兽企业重金招聘Python工程师标准>>> http://smallcultfollowing.com/babysteps/blog/categories/rust/ 转载于:https://my.oschina.net/innovation/blog/150099...
大连建网站策划/网课免费平台
概述 PowerJob是新一代分布式任务调度与计算框架,支持CRON、API、固定频率、固定延迟等调度策略,提供工作流来编排任务解决依赖关系,能让您轻松完成作业的调度与繁杂任务的分布式计算。 为什么选择PowerJob? 当前市面上流行的作…...
网站建设用户调查问卷/杭州seo中心
题型: 编程题 语言: G;GCC Description “丑数”是指除了质因子2,3,5,不含其它质因子的正整数,例如由小到大前10个“丑数”为 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, ... 非“丑数”的前10个数为 7, 11, 13, 14, 17, 19, 21, 22, 23, 26, ... 现…...
一级a做爰视频安全网站/网络推广外包要多少钱
ALLEXCEPT函数ALLEXCEPT函数属于“筛选”类函数,隶属于“表函数”,在ALL函数系列家族中,其地位是不可或缺的。EXCEPT翻译成中文是什么意思?表示:除了的意思。因此,这个函数所表达的意思顾名思义,…...