log4j2启动异步日志与动态修改日志级别

启动异步日志

启用 Log4j2 的异步日志记录功能可以显著提升日志记录的性能,尤其是在高并发的环境下。异步日志记录通过将日志事件放入队列中进行处理,从而减少了日志记录对应用程序性能的影响。以下是如何启用 Log4j2 异步日志记录的详细步骤。

1. 添加依赖

如果你使用的是 Maven,首先需要确保你的 pom.xml 文件中包含 Log4j2 的依赖:

<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.x.x</version>
</dependency>
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.x.x</version>
</dependency>
<dependency><groupId>com.lmax</groupId><artifactId>disruptor</artifactId><version>3.4.2</version>
</dependency>

2. 配置 Log4j2

Log4j2 支持两种方式启用异步日志记录:

  • 异步日志记录器(Asynchronous Loggers)
  • 异步追加器(Asynchronous Appenders)
异步日志记录器(Asynchronous Loggers)

异步日志记录器是全局性的,所有日志记录器都将异步地处理日志事件。以下是 log4j2.xml 的示例配置:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" packages=""><Appenders><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" /></Console></Appenders><Loggers><Root level="info" includeLocation="false"><AppenderRef ref="Console" /></Root></Loggers>
</Configuration>

然后,在 Java 运行参数中添加以下系统属性来启用全局异步日志记录器:

-Dlog4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
异步追加器(Asynchronous Appenders)

异步追加器是局部性的,只将指定的追加器配置为异步。以下是 log4j2.xml 的示例配置:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" packages=""><Appenders><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" /></Console><Async name="AsyncConsole"><AppenderRef ref="Console" /></Async></Appenders><Loggers><Root level="info" includeLocation="false"><AppenderRef ref="AsyncConsole" /></Root></Loggers>
</Configuration>

3. 测试异步日志

创建一个简单的 Java 应用程序来测试异步日志记录:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;public class AsyncLoggerExample {private static final Logger logger = LogManager.getLogger(AsyncLoggerExample.class);public static void main(String[] args) {for (int i = 0; i < 1000; i++) {logger.info("This is an async log message {}", i);}}
}

4. 启动应用

确保在启动应用时设置了正确的系统属性(如果使用异步日志记录器):

java -Dlog4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector -jar your-app.jar

总结

  • 使用异步日志记录器可以全局地处理日志事件,使所有日志记录器异步地处理日志。
  • 使用异步追加器可以局部地将特定的追加器配置为异步。
  • 通过将日志事件放入队列中处理,异步日志记录可以显著提升应用程序的性能,特别是在高并发环境中。

选择合适的方式来启用异步日志记录,并根据需要调整配置文件,以获得最佳性能和日志记录效果。

动态修改日志级别

在 Spring Boot 应用中,动态修改日志级别是一个常见需求,可以用于在运行时调整日志输出,以便进行调试或监控。Spring Boot 提供了一些方便的方式来实现这一点,包括通过 Spring Boot Actuator 和程序内配置修改。
以下是详细的实现方法:

方法 1: 使用 Spring Boot Actuator

Spring Boot Actuator 提供了对应用程序的管理端点,其中包括修改日志级别的功能。

1. 添加依赖

在你的 pom.xml 中添加 Actuator 依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2. 配置 Actuator 端点

在 application.properties 或 application.yml 文件中启用必要的端点:

management.endpoints.web.exposure.include=*

或者

management:endpoints:web:exposure:include: "*"
3. 修改日志级别

启动应用后,可以使用以下 HTTP 请求来修改日志级别:

  • 获取当前日志级别:
curl -s -X GET http://localhost:8080/actuator/loggers/{logger.name}

例如:

curl -s -X GET http://localhost:8080/actuator/loggers/com.example.MyClass
  • 修改日志级别:
curl -s -X POST http://localhost:8080/actuator/loggers/{logger.name} -H 'Content-Type: application/json' -d '{"configuredLevel":"DEBUG"}'

例如:

curl -s -X POST http://localhost:8080/actuator/loggers/com.example.MyClass -H 'Content-Type: application/json' -d '{"configuredLevel":"DEBUG"}'

方法 2: 通过程序内代码动态修改日志级别

你可以通过编程方式在应用运行时修改日志级别。

1. 使用 Logback 的 API

如果你使用的是 Logback 作为日志框架:

import org.slf4j.LoggerFactory;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.LoggerContext;
import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/loglevel")
public class LogLevelController {@PostMapping("/{loggerName}/{level}")public String changeLogLevel(@PathVariable String loggerName, @PathVariable String level) {LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();ch.qos.logback.classic.Logger logger = loggerContext.getLogger(loggerName);logger.setLevel(Level.toLevel(level));return "Log level for " + loggerName + " changed to " + level;}
}
2. 使用 Log4j2 的 API

如果你使用的是 Log4j2 作为日志框架:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.core.config.Configurator;
import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/loglevel")
public class LogLevelController {@PostMapping("/{loggerName}/{level}")public String changeLogLevel(@PathVariable String loggerName, @PathVariable String level) {org.apache.logging.log4j.Logger logger = LogManager.getLogger(loggerName);Configurator.setLevel(loggerName, org.apache.logging.log4j.Level.toLevel(level));return "Log level for " + loggerName + " changed to " + level;}
}

方法 3: 配置文件示例

确保在 application.properties 或 application.yml 中配置日志框架:

logging.level.com.example=INFO

或者

logging:level:com.example: INFO

测试动态修改日志级别

  1. 启动你的 Spring Boot 应用。
  2. 使用上述方法修改日志级别。
  3. 观察日志输出,确认日志级别已动态更新。

总结

通过以上方法,你可以在 Spring Boot 应用中动态修改日志级别,无论是通过 Actuator 提供的 HTTP 接口还是通过程序内的代码修改。这些方法使你可以灵活地调整日志级别,以满足不同场景下的调试和监控需求。

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

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

相关文章

【Python】写一篇setattr方法的使用博客

为何每次早餐 仍然魂离魄散 原来 那朝分手都要啜泣中上班 明明能够过得这关 赢回旁人盛赞 原来 顽强自爱这样难 难得的激情总枉费 残忍的好人都美丽 别怕 你将无人会代替 &#x1f3b5; 陈慧娴《情意结》 在 Python 中&#xff0c;动态地操作对象的属性是…

Oracle(15)什么是索引(Index)?

索引&#xff08;Index&#xff09;是数据库中一种用于提高查询性能的数据结构。索引在数据库表的一个或多个列上创建&#xff0c;类似于书的目录&#xff0c;通过索引可以快速定位和检索表中的数据行&#xff0c;而无需扫描整个表。尽管索引可以大幅提升查询性能&#xff0c;但…

2024 年 100 大数据科学面试问答

2024 年 100 大数据科学面试问答 一、说明 数据科学是一个快速发展的领域&#xff0c;它正在改变组织根据数据理解和做出决策的方式。因此&#xff0c;公司越来越多地寻求聘请数据科学家来帮助他们理解数据并推动业务成果。这导致了对数据科学家的高需求&#xff0c;这些职位的…

LeetCode 热题 HOT 100 (004/100)【宇宙最简单版】

【单调栈】No. 0739 每日温度 【中等】&#x1f449;力扣对应题目指路 希望对你有帮助呀&#xff01;&#xff01;&#x1f49c;&#x1f49c; 如有更好理解的思路&#xff0c;欢迎大家留言补充 ~ 一起加油叭 &#x1f4a6; ⭐ 题目描述&#xff1a;给定一个整数数组 temperatu…

《Windows API每日一练》13.1 打印基础

在Windows中使用打印机时&#xff0c;在调用一系列与打印相关的GDI绘图函数的背后&#xff0c;实际上启动了一系列模块之间复杂的交互过程&#xff0c;包括 GDI32库模块、打印机设备驱动程序库模块&#xff08;带.DRV后缀的文件&#xff09;、Windows后台打印处理程序&#xff…

rem 和 px 的关系

在网页设计中&#xff0c;rem 和 px 是用来表示长度或尺寸的单位&#xff0c;它们之间有以下默认关系&#xff1a; 1rem 16px&#xff08;假设根元素的字体大小为默认值&#xff09; 详细说明&#xff1a; 1、px&#xff08;像素&#xff09;&#xff1a; px 是一种绝对单…

【图像处理】不智能的目标识别

目录 目标识别的划分 识别入门 概念学习 滤波 模版 阈值化 形态学操作 开运算 闭运算 编程语言 示例 大家有没有想过在没有人工智能或者说没有机器学习的的时候&#xff0c;计算机是怎么做目标识别的&#xff1f; 计算机视觉时至今日也是急需人才的领域&…

(AAAI,2024)Structure-CLIP:利用场景知识图谱增强多模态结构化表征

文章目录 Structure-CLIP: Towards Scene Graph Knowledge to Enhance Multi-modal Structured Representations相关资料摘要引言方法通过场景图进行语义负采样场景图生成选择语义负样本对比学习目标知识增强编码器 Structure-CLIP: Towards Scene Graph Knowledge to Enhance …

go语言Gin框架的学习路线(七)

GORM入门(基于七米老师) 目录 GORM入门 安装 连接数据库 连接MySQL 连接PostgreSQL 连接Sqlite3 连接SQL Server 我们搞一个连接MySQL的例子 创建数据库 GORM操作MySQL GORM是一个流行的Go语言ORM&#xff08;对象关系映射&#xff09;库&#xff0c;它提供了一种方…

maven私服上传jar包 400 Bad Request 错误

文章目录 前言一、直接看报错二、问题处理三 maven 私服配置说明总结 前言 maven仓库的私服,一般会存放公司或者个人封装的jar包,用来共享给二次开发和协作伙伴用,很方便 第一次发布没有问题,但是我第二次发布,开始报错了 一、直接看报错 [外链图片转存失败,源站可能有防盗链…

数据库使用笔记-基于mysql

来自&#x1f96c;&#x1f436;程序员 Truraly | 田园 的博客&#xff0c;最新文章首发于&#xff1a;田园幻想乡 | 原文链接 | github &#xff08;欢迎关注&#xff09; 文章目录 MySql 一般信息观前提示登录 MySQLSQL 语句 数据库操作指令show databases | 现实数据库列表u…

问题解决实录 | Anaconda | Anaconda Navigator 启动无反应

问题解决实录 | Anaconda | Anaconda Navigator 启动无反应 以管理员身份运行 Anaconda Prompt conda update -n root conda conda update --all如果执行完以上步骤 碰到 AttributeError: module ‘pkgutil’ has no attribute ‘ImpImporter’. Did you mean: ‘zipimporter…

HC-SR04超声波测距模块使用方法和例程(STM32快速移植)

基于STM32和HC-SR04模块实现超声波测距功能 HC-SR04硬件概述HC-SR04超声波距离传感器的核心是两个超声波传感器。一个用作发射器&#xff0c;将电信号转换为40 KHz超声波脉冲。接收器监听发射的脉冲。如果接收到它们&#xff0c;它将产生一个输出脉冲&#xff0c;其宽度可用于…

各类专业技术的pdf电子书

从业多年&#xff0c;收集了海量的pdf电子书籍&#xff0c;感兴趣的私聊。

App Instance 架构示例

前言 在Unity程序设计过程中&#xff0c;我们处理的第一个对象是Application Instance。 它的主要职责是启动流程管理、卸载流程管理&#xff0c;次要职责是管理在内部的子系统生命周期。其他职责&#xff0c;提供或桥接应用程序的配置信息、及其他第三方接口。 它通常以单例的…

图解 Hadoop 架构 |Yarn、MapReduce

Hadoop Hadoop 是什么 Hadoop 是由 Apache 基金会所开发&#xff0c;维护的分布式系统基础架构主要解决海量数据的存储和海量数据的分析计算问题广义上来说&#xff0c;Hadoop 通常是指一个更广泛的概念——Hadoop 生态圈&#xff0c;包括 MapReduce&#xff0c;HDFS&#xf…

淼淼瀛湖水,青青枇杷林

淼淼瀛湖水&#xff0c;青青枇杷林 ——西安工程大学赴陕西安康“筑梦乡村&#xff0c;携手同行”暑期社会实践团 俗语言“五月枇杷满树金”。枇杷营养丰富&#xff0c;食用&#xff0c;具有止渴、润燥、清肺、止咳等功效。为探索枇杷产业&#xff0c;实现乡村振兴&#xff0c…

代码随想录 day 18 二叉树

第六章 二叉树part06 详细布置 530.二叉搜索树的最小绝对差 需要领悟一下二叉树遍历上双指针操作&#xff0c;优先掌握递归 题目链接/文章讲解&#xff1a;https://programmercarl.com/0530.%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E7%9A%84%E6%9C%80%E5%B0%8F%E7%B…

MacOSM1 配置Miniconda环境,并设置自启动

文章目录 设置环境变量设置自启动参考 设置环境变量 cd vim .zshrc输入一下内容 # 配置Conda CONDA_HOME/Users/hanliqiang/miniconda3 PATH$CONDA_HOME/bin:$PATH生效配置 source .zshrc设置自启动 conda init zsh.zshrc 文件中将会出现以下内容 # >>> conda i…

数据结构~~顺序表

目录 一、顺序表的概念 二、顺序表的接口实现 1.顺序表初始化 2.顺序表销毁 3.检查空间并扩容 4.顺序表尾插、顺序表头插 5.顺序表尾删、顺序表头删 6.顺序表查找 7.顺序表在pos位置插入x、删除pos位置的值 三、完整代码 四、总结 一、顺序表的概念 顺序表是用一段…