Log4j2原理及应用详解(十三)

本系列文章简介:

        在软件开发过程中,日志记录是一个不可或缺的重要环节。它不仅帮助开发者在开发阶段追踪和调试代码,还在软件运行阶段提供了宝贵的运行信息和错误追踪能力。随着软件系统的日益复杂,对日志记录的需求也变得越来越高,包括日志的灵活性、性能、安全性以及可管理性等方面。

        Log4j2,作为Apache Log4j的继任者,自发布以来便以其卓越的性能、灵活的架构和丰富的功能赢得了广泛的认可和应用。它不仅继承了Log4j的优点,还在多个方面进行了重大的改进和优化,特别是在日志性能、配置灵活性、自动重载配置以及无垃圾内存管理等方面,为开发者提供了更加强大和便捷的日志记录解决方案。

        本系列文章旨在通过深入剖析Log4j2的内部原理、详细讲解其配置方法、展示高级特性的应用,以及探讨在实际项目中的集成与管理,帮助读者全面理解和掌握Log4j2。无论您是Java开发者、系统管理员,还是对日志记录技术感兴趣的爱好者,本系列文章都将为您提供宝贵的参考和指导。

        我们相信,通过本系列的学习,您将能够熟练掌握Log4j2的使用技巧,并在实际项目中灵活应用其各项功能,从而为您的软件开发和运维工作带来极大的便利和效益。同时,我们也期待与您一起探索更多关于日志记录技术的奥秘,共同推动软件行业的进步和发展。

        欢迎大家订阅《Java技术栈高级攻略》专栏(PS:近期会涨价),一起学习,一起涨分!

目录

一、引言

二、Log4j2的应用

2.1 集成到Spring/Spring Boot项目中

2.2 在Web项目中的应用

2.2.1 log4j2-web模块的使用

1、引入依赖

2、配置log4j2-web模块

3、配置log4j2.xml

4、注意事项

2.2.2 Servlet上下文日志记录

1. 引入Log4j2依赖

2. 配置Log4j2

3. Servlet上下文日志记录

4. 部署和测试

2.3 日志管理与监控

三、总结与展望

四、结语


一、引言

        随着Logback的兴起,Log4j开始式微。为了应对这一挑战,Apache软件基金会决定开发Log4j的继任者——Log4j2。Log4j2不仅改进了Log4j的缺点,还借鉴了Logback的许多优点,号称在性能上完胜Logback。

        本文将跟随《Log4j2原理及应用详解(十二)》的进度,继续介绍Log4j2。希望通过本系列文章的学习,您将能够更好地理解Log4j2的内部工作原理,掌握Log4j2的使用技巧,以及通过合理的设计完成最佳实践,充分发挥优化Log4j2的潜力,为系统的高效运行提供有力保障。

二、Log4j2的应用

2.1 集成到Spring/Spring Boot项目中

        详见《Log4j2原理及应用详解(十二)

2.2 在Web项目中的应用

2.2.1 log4j2-web模块的使用

Log4j2在Web项目中的应用,特别是关于log4j2-web模块的使用,主要涉及以下几个方面:

1、引入依赖

在Web项目中,为了使用Log4j2的web功能,首先需要引入相关的依赖。这通常包括Log4j2的API、核心库以及专为Web应用设计的log4j2-web模块。如果使用Maven构建项目,可以在pom.xml文件中添加如下依赖(以Log4j2 2.x版本为例,具体版本号可能有所不同):

<dependency>  <groupId>org.apache.logging.log4j</groupId>  <artifactId>log4j-api</artifactId>  <version>你的Log4j2版本号</version>  
</dependency>  
<dependency>  <groupId>org.apache.logging.log4j</groupId>  <artifactId>log4j-core</artifactId>  <version>你的Log4j2版本号</version>  
</dependency>  
<dependency>  <groupId>org.apache.logging.log4j</groupId>  <artifactId>log4j-web</artifactId>  <version>你的Log4j2版本号</version>  <scope>runtime</scope>  
</dependency>
2、配置log4j2-web模块

log4j2-web模块提供了对Web环境的支持,包括Servlet容器中的日志上下文管理、Web请求日志记录等。配置log4j2-web模块主要通过在web.xml文件中添加监听器和过滤器来实现。

  1. 添加监听器

    监听器Log4jServletContextListener用于在Web应用启动时初始化Log4j2的日志上下文,并在Web应用停止时清理资源。在web.xml中添加如下配置:

    <listener>  <listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class>  
    </listener>

  2. 添加过滤器

    过滤器Log4jServletFilter用于拦截Servlet请求,允许在日志记录中包含有关Web请求的信息,如URL、用户代理等。在web.xml中添加如下配置:

    <filter>  <filter-name>log4jServletFilter</filter-name>  <filter-class>org.apache.logging.log4j.web.Log4jServletFilter</filter-class>  
    </filter>  
    <filter-mapping>  <filter-name>log4jServletFilter</filter-name>  <url-pattern>/*</url-pattern>  <dispatcher>REQUEST</dispatcher>  <dispatcher>FORWARD</dispatcher>  <dispatcher>INCLUDE</dispatcher>  <dispatcher>ERROR</dispatcher>  
    </filter-mapping>

3、配置log4j2.xml

除了配置web.xml外,还需要配置Log4j2的日志配置文件log4j2.xml。这个文件定义了日志的级别、格式、输出位置等。配置文件可以放在Web应用的类路径(如WEB-INF/classes)下,或者通过web.xml中的context-param指定其位置。

<context-param>  <param-name>log4jConfiguration</param-name>  <param-value>classpath:log4j2.xml</param-value>  
</context-param>

4、注意事项
  1. Servlet版本:Log4j2的web模块在Servlet 3.0及更高版本中工作得更好,因为它能够利用Servlet 3.0的ServletContainerInitializer API来自动注册监听器和过滤器。然而,在较旧的Servlet版本中,可能需要手动配置这些组件。

  2. 自动初始化:在Servlet 3.0及更高版本中,Log4j2-web模块默认会在Web应用启动时自动初始化。如果不希望这种行为发生,可以通过在web.xml中设置isLog4jAutoInitializationDisabledtrue来禁用它。

  3. 性能考虑:在某些Web容器中,如Tomcat 7.0.43之前的版本,默认会忽略包含log4j*的JAR文件,这可能导致Log4j2的自动初始化功能失效。如果遇到这种情况,需要更新Tomcat版本或在catalina.properties文件中修改jarsToSkip属性。

  4. 安全性:由于Log4j2的漏洞(如Log4Shell)曾引起广泛关注,因此在使用Log

2.2.2 Servlet上下文日志记录

在Web项目中,使用Log4j2进行日志记录是一个常见且强大的做法。当涉及到Servlet上下文(ServletContext)的日志记录时,你可能希望在全局范围内记录日志,或者根据当前的Web应用上下文来定制日志行为。以下是如何在Web项目中使用Log4j2进行Servlet上下文日志记录的一些步骤和考虑因素。

1. 引入Log4j2依赖

首先,确保你的Web项目中已经引入了Log4j2的依赖。这通常通过Maven或Gradle等构建工具来完成。

<!-- Maven 示例 -->  
<dependencies>  <!-- Log4j2 API -->  <dependency>  <groupId>org.apache.logging.log4j</groupId>  <artifactId>log4j-api</artifactId>  <version>(请使用最新版本)</version>  </dependency>  <!-- Log4j2 Core -->  <dependency>  <groupId>org.apache.logging.log4j</groupId>  <artifactId>log4j-core</artifactId>  <version>(同上)</version>  </dependency>  <!-- Log4j2 Web(可选,用于Web环境)-->  <dependency>  <groupId>org.apache.logging.log4j</groupId>  <artifactId>log4j-web</artifactId>  <version>(同上)</version>  </dependency>  <!-- SLF4J API(如果你打算使用SLF4J作为门面)-->  <dependency>  <groupId>org.slf4j</groupId>  <artifactId>slf4j-api</artifactId>  <version>(请使用最新版本)</version>  </dependency>  <!-- Log4j2 SLF4J Binding(如果你打算使用SLF4J作为门面)-->  <dependency>  <groupId>org.apache.logging.log4j</groupId>  <artifactId>log4j-slf4j-impl</artifactId>  <version>(同上)</version>  </dependency>  
</dependencies>

注意:log4j-web是可选的,它提供了对Web环境的特定支持,比如自动清理日志文件和与Servlet 3.0的日志API集成。

2. 配置Log4j2

src/main/resources目录下创建log4j2.xml配置文件,并根据你的需求进行配置。你可以配置Appender来指定日志的输出位置(如控制台、文件、数据库等),以及Logger来设置日志的级别和引用Appender。

<?xml version="1.0" encoding="UTF-8"?>  
<Configuration status="WARN">  <Appenders>  <Console name="Console" target="SYSTEM_OUT">  <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/>  </Console>  <!-- 其他Appender配置,如RollingFile等 -->  </Appenders>  <Loggers>  <Root level="info">  <AppenderRef ref="Console"/>  </Root>  <!-- 特定包或类的日志级别配置 -->  </Loggers>  
</Configuration>

3. Servlet上下文日志记录

在Servlet中,你可以通过ServletContext来访问一些全局级别的信息,但Log4j2本身并不直接提供基于ServletContext的日志记录API。然而,你可以通过以下几种方式来实现基于Servlet上下文的日志记录:

  • MDC(Mapped Diagnostic Context):你可以在Servlet的过滤器(Filter)中设置MDC,然后在Log4j2的配置中使用这些MDC值来动态地添加日志信息。例如,你可以在请求开始时将用户ID或会话ID放入MDC,然后在日志配置中使用%X{userId}%X{sessionId}来引用这些值。

  • Logger上下文:Log4j2允许你为不同的上下文(如不同的Web应用或不同的线程)创建不同的Logger配置。然而,在标准的Servlet容器(如Tomcat)中,这通常不是必需的,因为每个Web应用通常都有自己的类加载器和日志配置。

  • 自定义Appender:如果你需要更复杂的日志记录逻辑,你可以实现自定义的Appender,并在其中访问ServletContext(尽管这通常不是Appender的职责)。然而,更常见的做法是在过滤器或Servlet中设置MDC,并在Appender配置中引用这些MDC值。

4. 部署和测试

将你的Web应用部署到Servlet容器中,并测试日志记录是否按预期工作。确保Log

2.3 日志管理与监控

        详见《Log4j2原理及应用详解(十四)

三、总结与展望

        详见《Log4j2原理及应用详解(十四)

四、结语

        文章至此,已接近尾声!希望此文能够对大家有所启发和帮助。同时,感谢大家的耐心阅读和对本文档的信任。在未来的技术学习和工作中,期待与各位大佬共同进步,共同探索新的技术前沿。最后,再次感谢各位的支持和关注。您的支持是作者创作的最大动力,如果您觉得这篇文章对您有所帮助,请分享给身边的朋友和同事!

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

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

相关文章

8.3 End-to-end Data Protection (Optional)

8.3 End-to-end Data Protection (Optional) 为了提供从应用程序到NVM介质并返回到应用程序本身的稳健数据保护,可以使用端到端数据保护。如果启用了此可选机制,则将额外的保护信息(例如CRC)添加到逻辑块中,控制器和/或主机软件可以对其进行评估,以确定逻辑块的完整性。…

大模型能干什么

大模型是指具有庞大参数量和复杂结构的机器学习模型。相比于传统的小模型&#xff0c;大模型通常具有更强的表达能力和更高的预测准确性&#xff0c;其在机器学习和人工智能领域中扮演着至关重要的角色&#xff0c;它们能够处理大规模数据和复杂模型&#xff0c;具有广泛的应用…

一文带你读懂MLIR论文,理解MLIR设计准则.

论文MLIR: Scaling Compiler Infrastructure for Domain Specific Computation MLIR&#xff1a;针对特定领域计算扩展编译器基础设施 文章目录 论文MLIR: Scaling Compiler Infrastructure for Domain Specific Computation1. 论文下载2. TVM关于MLIR的讨论3. 论文正文0. 摘要…

02互联网行业的产品方向(2)

数字与策略产品 大数据时代&#xff0c;数据的价值越来越重要。大多数公司开始对内外全部数据进行管理与挖掘&#xff0c;将业务数据化&#xff0c;数据资产化&#xff0c;资产业务化&#xff0c;将数据产品赋能业务&#xff0c;通过数据驱动公司业务发展&#xff0c;支撑公司战…

关于Hadoop生态系统一部分的Catalog

Catalog在大数据处理和分析的上下文中&#xff0c;它不是一个独立的实体或系统&#xff0c;而是数据处理框架&#xff08;如Apache Flink、Apache Hive、Apache Spark等&#xff09;内部的一个组件。它的主要职责是管理和提供数据集的元数据&#xff0c;使得这些框架可以透明地…

Unity VR开发入门:探索虚拟现实世界的无限可能

目录 引言 Unity VR开发基础 1. 安装Unity与VR SDK 2. 创建VR项目 3. 理解VR场景结构 Unity VR开发实战 1. 场景搭建 2. 交互设计 创建C#脚本 编写VRInteractor脚本 应用脚本到场景 注意 修改VRInteractor脚本 3. 用户体验优化 4. 测试与调试 引言 随着科技的飞速…

docker: No space left on device处理与迁移目录

简介&#xff1a;工作中当遇到Docker容器内部的磁盘空间已满。可能的原因包括日志文件过大、临时文件过多或者是Docker容器的存储卷已满&#xff0c;需要我们及时清理相关文件&#xff0c;并对docker的路径进行迁移。 历史攻略&#xff1a; centos&#xff1a;清理磁盘空间 …

知识库问答研究进展与展望

基于知识库的问答(QuestionAnsweringoverKnowledgeBase,KBQA)是问答系统的重要组成部分,要求计算机正确理解自然语言问题的语义,并从知识库中提取问题的答案.早期研究主要关注仅涉及到单个关系三元组的简单问答,近年来,随着以深度学习为代表的表示学习技术在简单问答任务的成功…

Https post 请求时绕过证书验证方案

解决异常&#xff1a;Caused by: java.security.cert.CertificateException: No subject alternative names matching IP address xxx.xx.xx.xx found // Https POST 请求private cn.hutool.json.JSON PostGsData(String url, String appKey, String token, Map<String, Ob…

VMware 虚拟机 ping 不通原因排查

目录 一、检查网络 二、重启虚拟机网络 因为最近遇到了一个比较奇怪的 ping 不通虚拟机的事&#xff0c;在此过程中&#xff0c;检查了很多的设置&#xff0c;故而写一篇文章记录下&#xff0c;如有 VMware 虚拟机 ping 不通可以尝试本文的排查方式。 下面以 VMware 虚拟机为…

Day03-Pod环境变量,容器重启策略,emptyDir,hostPath,nfs存储卷,资源限制及configMap,secret实战案例

Day03-Pod环境变量&#xff0c;容器重启策略&#xff0c;emptyDir&#xff0c;hostPath&#xff0c;nfs存储卷&#xff0c;资源限制及configMap&#xff0c;secret实战案例 0、昨日内容回顾:1、面试题预告1.1 Q1&#xff1a;Pod的容器的三种重启策略:&#xff08;注意&#xff…

数学建模--灰色关联分析法

目录 简介 基本原理 应用场景 优缺点 优点&#xff1a; 缺点&#xff1a; 延伸 灰色关联分析法在水质评价中的具体应用案例是什么&#xff1f; 如何克服灰色关联分析法在主观性强时的数据处理和改进方法&#xff1f; 灰色关联分析法与其他系统分析方法&#xff08;如A…

记录些MySQL题集(17)

一、MySQL索引为何使用B树结构&#xff1f; MySQL的索引机制中&#xff0c;默认使用BTree作为底层的数据结构&#xff0c;但为什么要选择B树呢&#xff1f;有人会说树结构是以二分法查找数据&#xff0c;所以会在很大程度上提升检索性能&#xff0c;这点确实没错&#xff0c;但…

C++初学者指南-5.标准库(第一部分)--标准库查询存在算法

C初学者指南-5.标准库(第一部分)–标准库查询存在算法 文章目录 C初学者指南-5.标准库(第一部分)--标准库查询存在算法any_of / all_of / none_ofcountcount_if相关内容 不熟悉 C 的标准库算法&#xff1f; ⇒ 简介 any_of / all_of / none_of 如果在输入范围(所有元素…

解决django与sqlite3不兼容报SQLite 3.9.0 or later is required错的问题

今天在尝试用pytest进行django的单元测试&#xff0c;pytest用的数据库是sqlite3&#xff0c;在window环境下测试得好好的&#xff0c;但是放到linux环境下就报错&#xff0c;具体是报django.core.exceptions.ImproperlyConfigured: SQLite 3.9.0 or later is required (found …

GPT-LLM

本心、输入输出、结果 文章目录 GPT-LLM前言国际公司AI发展概览国内公司AI发展概览GPT-LLM 编辑 | 简简单单 Online zuozuo 地址 | https://blog.csdn.net/qq_15071263 如果觉得本文对你有帮助,欢迎点赞、收藏、评论 前言 国际公司AI发展概览 公司主要AI贡献与产品特点OpenAI…

【LeetCode】day17:654 - 最大二叉树, 617 - 合并二叉树, 700 - 二叉树搜索树中的搜索, 98 - 验证二叉搜索树

LeetCode 代码随想录跟练 Day17 654.最大二叉树617.合并二叉树700.二叉搜索树中的搜索98.验证二叉搜索树 654.最大二叉树 题目描述&#xff1a; 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的…

SpringBoot整合SSE,实现后端主动推送DEMO

前言 说起服务端主动推送&#xff0c;大家第一个想到的一定是WEBSOCKET 。 作为软件工程师&#xff0c;不能无脑使用一种技术&#xff0c;要结合实际情况&#xff0c;择优选取。 SSE&#xff08;Server-Sent Events&#xff09;相比于WEBSOCKET 1、轻量化、兼容性 基于传统…

用 AI 解决电脑问题、推荐电影、游戏攻略

担任电脑专家 prompt&#xff1a; 作为一名电脑专家&#xff0c;我拥有广泛的技能和知识来解决各种电脑问题。你的身份是围绕着为 用户提供电脑相关支持和解决疑难问题的专业人士。 你擅长于以下领域&#xff1a; 1. 硬件故障排除&#xff1a;你能够检测和修复与电脑硬件相关…

学懂C语言(十一): C语言哪些数据类型适合位运算操作?

目录 1. 整型数据类型 1.1 int 1.2 unsigned int 1.3 short 1.4 unsigned short 2. 字符型数据 2.1 char 2.2 unsigned char 3. 长整型数据 3.1 long 和 unsigned long 3.2 long long 和 unsigned long long 总结 位运算主要用于整型数据类型&#xff0c;因为这些类…