log4j2 + slf4j 项目实践

深入解析Java日志框架:Logback、Log4j 2与SLF4J的区别与使用指南 阅读详情

End of Life On August 5, 2015 the Logging Services Project Management 
Committee announced that Log4j 1.x had reached end of life. For 
complete text of the announcement please see the Apache Blog. Users of 
Log4j 1 are recommended to upgrade to Apache Log4j 2. 
是的,log4j停止于1.x版本,迎来了log4j 2,也就是我们今天要说的log4j 2.

Log4j 1.x 在高并发情况下出现死锁导致cpu使用率异常飙升
Log4j2.0基于LMAX Disruptor的异步日志在多线程环境下性能会远远优于Log4j 1.x和logback(官方数据是10倍以上)

使用slf4j门面模式调用:
import  org.slf4j.Logger;
import  org.slf4j.LoggerFactory;

private static final Logger logger = LogManager.getLogger(TestLog4j2Application.class);
logger.info(...);
logger.warn(...);
logger.error(...);

 

项目原来是使用log4j + slf4j 使用的,打印日志都是使用slf4j这个门面模式。改造起来比较轻松,不需要改动代码。

看了许多论坛的文章,自己整理了一份,比较适合项目的配置。

web项目,pom.xml配置:

        <!-- log4j2 结合 slf4j Start -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.9.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.9.1</version>
        </dependency>
        <!-- Web项目需添加 -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-web</artifactId>
            <version>2.9.1</version>
        </dependency>
        <!--用于与slf4j保持桥接-->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.9.1</version>
        </dependency>
        <!-- slf4j核心包-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.25</version>
        </dependency>
        <!-- log4j2 结合 slf4j End -->

 

resources 下 log4j2.xml 配置

<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j2 能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<Configuration status="info" monitorInterval="300">
    <Properties>
        <!-- log输出位置 -->
        <Property name="log_base_dir">${sys:catalina.home}/logs/aglog</Property>
        <!-- log输出格式 -->
        <Property name="log_pattern">%d{yyyy-MM-dd HH:mm:ss:SSS} [%t] %p %C:%L - %m%n</Property>
        <!-- 单个日志文件大小 50MB-->
        <Property name="log_size">50MB</Property>
        <!-- 设置同一类型日志,(每天的文件数量上限 20),默认为7个-->
        <Property name="log_file_max">20</Property>
    </Properties>

    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <!-- 控制台只记录debug及以上级别日志,其他拒绝 -->
            <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="${log_pattern}"/>
        </Console>
        <!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面,每天的日志压缩存档-->
        <!-- 普通必要的日志 -->
        <RollingFile name="InfoLog" fileName="${log_base_dir}/info.log"
                     filePattern="${log_base_dir}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log.gz">
            <!-- 只记录info级别日志,其他拒绝 -->
            <Filters>
                <ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <PatternLayout pattern="${log_pattern}"/>
            <Policies>
                <TimeBasedTriggeringPolicy modulate="true" interval="1"/>
                <SizeBasedTriggeringPolicy size="${log_size}"/>
            </Policies>
            <DefaultRolloverStrategy max="${log_file_max}"/>
        </RollingFile>
        <!-- 警告日志 -->
        <RollingFile name="WarnLog" fileName="${log_base_dir}/warn.log"
                     filePattern="${log_base_dir}/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log.gz">
            <!-- 只记录warn级别日志,其他拒绝 -->
            <Filters>
                <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <PatternLayout pattern="${log_pattern}"/>
            <Policies>
                <TimeBasedTriggeringPolicy modulate="true" interval="1"/>
                <SizeBasedTriggeringPolicy size="${log_size}"/>
            </Policies>
            <DefaultRolloverStrategy max="${log_file_max}"/>
        </RollingFile>
        <!-- 错误日志 -->
        <RollingFile name="ErrorLog" fileName="${log_base_dir}/error.log"
                     filePattern="${log_base_dir}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log.gz">
            <!-- 只记录error及以上级别日志,其他拒绝 -->
            <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="${log_pattern}"/>
            <Policies>
                <TimeBasedTriggeringPolicy modulate="true" interval="1"/>
                <SizeBasedTriggeringPolicy size="${log_size}"/>
            </Policies>
            <DefaultRolloverStrategy max="${log_file_max}"/>
        </RollingFile>
    </Appenders>

    <Loggers>
        <!--过滤掉spring、hibernate 等,一些无用的DEBUG信息-->
        <logger name="org.springframework" level="INFO"></logger>
        <logger name="org.hibernate" level="INFO"></logger>

        <Root level="DEBUG">
            <!-- 打生产包前,建议将Console注释掉 -->
            <appender-ref ref="Console"/>
            <appender-ref ref="InfoLog"/>
            <appender-ref ref="WarnLog"/>
            <appender-ref ref="ErrorLog"/>
        </Root>
    </Loggers>
</Configuration>

 

关于压缩文件格式log4j2对 gz的格式,比zip的 支持要好:

有趣的现象,我测试时使用的文件size上限10KB,数量最多10个。

当超出数量,覆盖时。zip的名称与内部log名称不同,好几个文件解压后名称都是一样的。而gz不会有这种情况。

 

gz的压缩后占用更小:

 

 

 

别再乱配了!Spring Boot项目里MyBatis日志选SLF4J+Logback还是Log4j2? 本文深入探讨了Spring Boot项目中MyBatis日志框架的选型问题,对比了SLF4J+Logback和Log4j2的性能、功能及适用场景,并提供了详细的配置方案和优化建议,帮助开发者做出更合理的选择。 阅读详情

相关推荐

SpringBoot项目如何优雅替换Logback为Log4j2?5步搞定性能提升

本文详细介绍了如何将SpringBoot项目中的默认日志框架Logback优雅替换为高性能的Log4j2。通过5个关键步骤——深度评估、依赖治理、配置重构、代码适配与验证监控,开发者可以平滑完成迁移,有效解决高并发场景下的日志性能瓶颈,显著提升系统吞吐量并降低延迟。

p4q5r6s7t的博客 532

Log4j 2 + Slf4j 的配置和使用

Log4j 2 + Slf4j 的配置和使用 Log4j 2是log4j 1.x和logback的改进版,据说采用了一些新技术(无锁异步、等等),使得日志的吞吐量、性能比log4j 1.x提高10倍,并解决了一些死锁的bug,而且配置更加简单灵活。下面是结合slf4j的配置和使用过程: 1、引用依赖包及相关注释: >org.apache.logging.log4j>2.2>

t1993ing的博客 1249

Java日志配置避坑指南:5分钟解决SLF4J与Log4j的‘No appenders could be found‘警告

本文深入解析Java项目中常见的SLF4J与Log4j整合时出现的'No appenders could be found for logger'警告。从问题根源、基础配置到进阶排查,提供了详细的解决方案和依赖冲突检查清单,并给出了向Log4j 2迁移的最佳实践建议,帮助开发者快速修复并构建稳健的日志体系。

weixin_28358083的博客 257

Log4j2+slfj4 日志基础讲解和使用

Log4j2+slf4j日志基础讲解

weixin_49297205的博客 1071

log4j-to-slf4j-2.8.2.jar

Log4j 2 API和SLF4J之间的Apache Log4j绑定。 org.apache.logging.log4j/log4j-to-slf4j/2.8.2/log4j-to-slf4j-2.8.2.jar

STM32H750xx【QSPI】轮询方式读写GD25Q64E

本文详细介绍了GD25Q64E其特性、引脚定义及功能说明,重点阐述了在STM32H750平台上通过CubeMX配置QuadSPI接口的步骤,包括时钟设置、参数优化等。文章提供了完整的BSP驱动开发流程,涵盖写使能、四线模式使能、ID读取、解除保护、扇区擦除、整片擦除、页编程和数据读取等关键功能实现,并通过读写测试验证了DummyCycles参数对数据准确性的影响。

honmy18的博客 1421

Spring Boot启动报错,log4j2日志依赖冲突,报错提示:log4j-slf4j-impl cannot be present with log4j-to-slf4j

(1)问题描述 在Spring Boot基础之上,集成Spring Security框架的时候,启动项目报错: Caused by: org.apache.logging.log4j.LoggingException: log4j-slf4j-impl cannot be present with log4j-to-slf4j 报错内容如下: SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in

✅ Java 开发工程师 1万+

《生成式AI引发的“认知污染”:社交媒体虚假信息的治理困局》

认知污染与生成式AI“认知污染”指信息环境被大量虚假、误导性内容所充斥,干扰公众对事实的认知判断。在社交媒体时代,虚假信息的生产和传播门槛大幅降低,呈现出工业化、规模化的趋势。近年兴起的生成式人工智能(Generative AI)技术,如大型语言模型(LLM)和深度伪造(deepfake),更是加剧了这一问题。AI可以自动生成看似真实的文本、图像、音视频,将虚假信息批量生产并快速散播到社交平台上。

那谁的博客 5910

java log4j2 log4j 冲突,将log4j2与slf4j一起使用:java.lang.StackOverflowError

因此,我尝试按照其网站上的此(非Maven实现)和要求将slf4j添加到log4j。并尝试使用此代码public static void main(String[] args) {Logger logger = LoggerFactory.getLogger(Main.class);logger.info("test");}并将以下内容添加到我的库中log4j-api-2.3.jarlog4j-c...

weixin_34759490的博客 756

沈阳计算机研究所复试,沈阳计算所复试试题附答案.doc

沈阳计算所复试试题附答案目录数据结构1200612007220085200914操作系统16200616200718200818200919组成原理20200620200720200821200921经典算法22数据结构2006数据结构部分(共25分,第1题10分,第2题15分)在(下图)所示的有向图中:v1 v2v4 ...

weixin_42511053的博客 856

GAMIT基线解算实战:从RINEX数据准备到精度报告解读(附2024年tables更新攻略)

本文详细解析了2024年GAMIT基线解算全流程,从RINEX数据准备到精度报告解读,特别更新了tables配置攻略。涵盖工程目录设计、数据预处理、关键配置文件更新及基线解算策略优化,帮助用户掌握高精度GNSS数据处理技术,提升解算效率和结果可靠性。

weixin_42520374的博客 305

log4j-slf4j-impl cannot be present with log4j-to-slf4j

背景 项目使用@slf4j注解,注入日志组件进行日志打印。POM中引入了spring-boot-starter-logging、spring-boot-starter-log4j2、log4j2、slf4j、logback等多种日志组件。 某次修改业务代码后,系统无法启动,并报错log4j-slf4j-impl cannot be present with log4j-to-slf4j。 SLF4J: Class path contains multiple SLF4J bindings. SLF4J: F

shuxiaohua的博客 5994

halcon3D 点云拟合球体

halon3D 点云拟合球面

weixin_43213429的博客 1639

【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板

SLF4J(Simple Logging Facade for Java)是一个日志框架的抽象层,可以与不同的日志实现进行绑定。它允许开发人员在代码中使用统一的日志接口,而无需关心具体的日志实现。简单来讲就是slf4j是一系列的日志门面,也可以理解为 是接口,而 和 是具体实现了这些接口的日志框架,slf4j 具备很高的易用性和很好的抽象性。Logback是Log4j的后继版本,由Log4j的作者开发。相比Log4j,Logback具有更好的性能和更丰富的功能,同时也更易于配置和扩展。Logback是

实用技术干货分享⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄对您有用的话请点个关注吧~ 2267

深度学习在移动开发中的应用:实时姿态估计实战

我们将使用TensorFlow Lite框架,结合专为移动端优化的MoveNet模型,实现一个能够在主流Android设备上达到30FPS的多人姿态跟踪解决方案,并深入探讨其优化技巧和实际应用场景。特别是3D姿态估计、多人长期跟踪等前沿技术的发展,将进一步推动移动端姿态估计技术的应用深度和广度。在下一篇文章中,我们将探讨深度学习在移动端的另一个创新应用:实时手势识别,包括如何在资源受限的环境中实现复杂手势的实时识别,以及这项技术在AR/VR交互、智能家居控制等场景中的应用。第四部分:典型应用场景实现。

Programming Talk 325

基于STM32+华为云设计的智慧农业灌溉系统(2023升级版)(158)

本项目设计一种基于STM32的智慧农业监测系统。该系统能够检测空气温度、湿度、光强度和土壤湿度等关键指标,并自动调节浇水量,实现作物生长环境的精细化管理。同时,本项目还支持本地LCD屏幕数据显示和通过ESP8266上传数据到华为云物联网平台,同时搭建流媒体服务器实现摄像头远程监控。最重要的是,本项目将利用Qt开发Android手机APP,使用户可以远程查看监测情况,了解农作物生成情况。

1万+

springboot使用slf4j+log4j2实现项目日志记录

后端Java是如何记录项目日志 1.日志的概念 项目中日志文件作用的是什么 日志文件是用于记录系统操作事件的文件集合,可分为事件日志和消息日志。具有处理历史数据、诊断问题的追踪以及理解系统的活动等重要作用。 在计算机中,日志文件是记录在操作系统或其他软件运行中发生的事件或在通信软件的不同用户之间的消息的文件。记录是保持日志的行为。在最简单的情况下,消息被写入单个日志文件 。 许多操作系统,软件框架和程序包括日志系统。广泛使用的日志记录标准是在因特网 工程任务组(IETF )RFC 5424中定义的 sysl

qq_45172779的博客 1936

学Simulink——基于直流电机的建模与控制场景实例:直流电机带负载突变时的动态响应仿真

在实际应用中,直流电机经常需要应对各种工作条件的变化,例如负载突变。了解电机在这种情况下的动态响应特性对于确保系统的稳定性和可靠性至关重要。通过仿真分析,可以预测电机在不同负载条件下的表现,并优化控制系统的设计。本文将详细介绍如何使用来构建一个直流电机带负载突变时的动态响应仿真模型,并通过仿真展示其应用效果。本文介绍了如何使用构建一个直流电机带负载突变时的动态响应仿真模型,并通过仿真展示了其应用效果。

xiaoheshang_123的博客 114

Spring Boot 项目日志系统全攻略:Logback、Log4j2、Log4j与SLF4J整合指南

SLF4J:日志门面框架(必须)Logback:默认实现(Spring Boot官方推荐)Log4j2:高性能替代方案Log4j:旧版实现(不推荐新项目使用)📌最佳实践:无论使用哪种实现,都应该通过SLF4J API进行日志记录,保持代码与具体实现的解耦。新项目推荐组合传统项目组合必须避免:直接使用Log4j 1.x核心原则代码中始终使用SLF4J API合理选择日志级别生产环境使用异步日志建立完善的日志监控体系通过合理配置日志系统,可以显著提升应用的可靠性和可维护性。

qq_42763903的博客 1613

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

SpringBoot项目启动报错:LoggerFactory冲突?5分钟搞定Logback与slf4j-log4j的相爱相杀

本文深入解析SpringBoot项目启动时常见的“LoggerFactory is not a Logback LoggerContext”错误。该错误源于classpath上存在多个日志框架(如Logback与slf4j-log4j12)冲突,导致SLF4J绑定混乱。文章提供了从依赖树分析到四种解决方案(排除法、统一版本、替换实现、处理顽固依赖)的完整实战指南,帮助开发者彻底解决日志框架冲突问题。

kkk56的博客 1012

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

logback VS log4j2 那些你注意不到的性能差距...

logback, log4j2 等都是非常优秀的日志框架, 在日常使用中,我们很少会关注去使用哪一个框架, 但其实这些日志框架在性能方面存在明显的差异。尤其在生产环境中, 有时候日志的性能高低,很可能影响到机器的成本, 像一些大企业,如阿里、腾讯、字节等,一点点的性能优化,就能节省数百万的支出。再次, 统一日志框架也是大厂常有的规范化的事情, 还可以便于后续的ETL流程, 因此,我们选一个日志框架,其实还是比较重要的。

BASK2311的博客 3123

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

SpringBoot整合log4j2详细教程

首先,认识一下三胞胎 log4j是apache实现的一个开源日志组件 logback同样是由log4j的作者设计完成的,拥有更好的特性,用来取代log4j的一个日志框架,是slf4j的原生实现 Log4j2是log4j 1.x和logback的改进版,据说采用了一些新技术(无锁异步、等等),使得日志的吞吐量、性能比log4j 1.x提高10倍,并解决了一些死锁的bug,而且配置更加简单灵活 ...

Felix_阳的博客 1246

SpringBoot项目如何使用Log4j2+SLF4J构建日志

springboot项目日志配置与挂载

xike1024的博客 1024

Spring学习笔记—Spring集成log4j

目录 Log4j概念和优点 log4j2配置 log4j的日志级别 日志打印实现 Log4j概念和优点 Log4j是Apache的一个开源日志项目,通过log4j,开发人员可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是远程服务器。可以通过配置文件来灵活配置日志输出格式和日志生成级别,不需要修改应用程序代码,大大降低了对应用程序的侵入性。 log4j2配置 log4j2是通过xml进行配置,一般命名为log4j2.xml。 ...

u012455675的博客 541

Log4j2和logback比较

‌:常规项目用 ‌。

236

SpringBoot项目启动报SLF4J冲突?5分钟搞定日志框架依赖排除

本文详细解析了SpringBoot项目中常见的SLF4J日志框架冲突问题,提供了5种快速解决方案,包括依赖排除、统一版本管理和使用Maven Enforcer插件等。通过可视化工具和命令行分析,帮助开发者高效定位并解决org.slf4j冲突,确保项目顺利启动。

gan8painter的博客 213
上一篇: JS 数组,对象。中划线、数字属性时值获取
下一篇: phoenix 5.0 CURSOR 游标
Cky079
博客等级 码龄16年 10粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值