JAVA日志组件系列(三)log4j+logback+slf4j的关系与调试

log4j-over-slf4j的jar包适配原理解析 如果想把项目中的日志实现统一成slf4j的话,则需要把第三方一些依赖包中的日志包去掉,例如Spring中的jcl,或者其他的像早期的log4j,如果直接排除,则程序肯定会运行报错,此时需要引入适配包,这个适配包就是一个狸猫换太子包,这个包有着和jcl和log4j一摸一样的包名和类名,所以在程序动态运行过程中,只需要关心classpath下有没有这个类即可,并不需要知道这个类在哪个jar包,正因如此,才能实现狸猫换太子的功能。下面写一个测试程序:最开始是先有的jcl这个包,然后这个包中依赖log4j这个包,在 阅读详情
背景 
    由于现在开源框架日益丰富,好多开源框架使用的日志组件不尽相同。存在着在一个项目中,不同的版本,不同的框架共存。导致日志输出异常混乱。虽然也不至于对系统造成致命伤害,但是明显可以看出,架构不够精良,追求极致略有不足。 
    其中有一些标准通用接口,标准实现,各种桥接器的存在,下面就让笔者树立一下这些框架之间的关系。 
 
从上图中,我们可以看到4部分。 
接口:将所有日志实现适配到了一起,用统一的接口调用。 
实现:目前主流的日志实现 
旧日志到slf4j的适配器:如果使用了slf4j,但是只想用一种实现,想把log4j的日志体系也从logback输出,这个是很有用的。 
slf4j到实现的适配器:如果想制定slf4j的具体实现,需要这些包。 

slf4J与旧日志框架的关系 
slf4j等于commons-logging,是各种日志实现的通用入口,会根据classpath中存在下面哪一个Jar来决定具体的日志实现库。 
logback-classic(默认的logback实现) 
slf4j-jcl.jar(apache commons logging) 
slf4j-logj12.jar(log4j 1.2.4) 
slf4j-jdk14(java.util.logging) 
将所有使用旧式日志API的第三方类库或旧代码的日志调用转到slfj 
jcl-over-slf4j.jar/jcl104-over-slf4j:apache commons logging 1.1.1/1.0.4,直接替换即可。 
log4j-over-slf4j.jar:log4j,直接替换即可。 
jul-to-slf4j:jdk logging,需要在程序开始时调用SLF4JBridgeHandler.install()来注册listener参考JulOverSlf4jProcessor,可在applicationContext.xml中定义该bean来实现初始化。注意原有的log4j.properites将失效,logback网站上提供转换器,支持从log4j.properties 转换到logback.xml 。 

优势:转移到logback的理由 
    slf4j支持参数化的logger.error("帐号ID:{}不存在", userId);告别了if(logger.isDebugEnable()) 时代。 
    另外logback的整体性能比log4j也较佳,hibernate等项目已经采用了slf4j:"某些关键操作,比如判定是否记录一条日志语句的操作,其性能得到了显著的提高。这个操作在LOGBack中需要3纳秒,而在Log4J中则需要30纳秒。 LOGBack创建记录器(logger)的速度也更快:13毫秒,而在Log4J中需要23毫秒。更重要的是,它获取已存在的记录器只需94纳秒,而 Log4J需要2234纳秒,时间减少到了1/23。" 

slf4j和logback的使用 
1.如果日志的参数超过3个,需要写成 
Object[] params = {newVal, below, above}; logger.debug("Value {} was inserted between {} and {}.", params); 
commons-logging 和slf4j的代码比较:commons-logging 示例代码: 
Java代码  收藏代码
  1. import org.apache.commons.logging.Log;  
  2. import org.apache.commons.logging.LogFactory;  
  3.   
  4. public class TestLog {  
  5.     Log log = LogFactory.getLog(TestLog.class);  
  6.   
  7.     public void print() {  
  8.         if (log.isDebugEnabled()) {  
  9.             log.debug(sql);  
  10.             log.debug("My name is " + name + ", I am " + age + " years old.");  
  11.         }  
  12.     }  
  13. }  

slf4j的示例代码: 
Java代码  收藏代码
  1. import org.slf4j.Logger;  
  2. import org.slf4j.LoggerFactory;  
  3.   
  4. public class TestLogBySlf4J {  
  5.     Logger logger = LoggerFactory.getLogger(TestLogBySlf4J.class);  
  6.   
  7.     public void print() {  
  8.         logger.debug(sql);  
  9.         logger.debug("My name is {}, I am {} years old.", name, age);  
  10.     }  
  11. }  

2.因为内部已优化,作者认为slf4j的logger不需要定义为static。 
3.可设置缓存后批量写日志文件(但服务器如果重启,可能会丢失未写到磁盘的记录) 
4.MDC,用Filter,将当前用户名等业务信息放入MDC中,在日志format定义中即可使用该变量。 
5.JMS Appender用于告警, DB Appender用于业务日志等 

生产环境情况以及优雅方案 
    我厂的项目由于使用了众多的开源架构,所以导致项目中的日志体系非常混乱。经常出现日志包冲突的情况。例如:commons-logging-1.0.4,commons-logging-1.1.3,log4j,logback,jboss-logging,java.util.logging......不同的版本,不同的实现。之前笔者至少要配置log4j,logback,commons-logging三个配置文件,才能完成日志的输出。研究了日志体系以后,我厂的maven的pom.xml如下 
Xml代码  收藏代码
  1.     <!-- log -->  
  2. <dependency>  
  3.     <groupId>org.slf4j</groupId>  
  4.     <artifactId>slf4j-api</artifactId>  
  5.     <version>${org.slf4j-version}</version>  
  6. </dependency>  
  7. <dependency>  
  8.     <groupId>org.slf4j</groupId>  
  9.     <artifactId>jcl-over-slf4j</artifactId>  
  10.     <version>${org.slf4j-version}</version>  
  11. </dependency>  
  12. <dependency>  
  13.     <groupId>org.slf4j</groupId>  
  14.     <artifactId>log4j-over-slf4j</artifactId>  
  15.     <version>${org.slf4j-version}</version>  
  16. </dependency>  
  17. <dependency>  
  18.     <groupId>org.slf4j</groupId>  
  19.     <artifactId>jul-to-slf4j</artifactId>  
  20.     <version>${org.slf4j-version}</version>  
  21. </dependency>  
  22. <dependency>  
  23.     <groupId>org.jboss.logging</groupId>  
  24.     <artifactId>jboss-logging</artifactId>  
  25.     <version>3.1.4.GA</version>  
  26. </dependency>  
  27. <!--   
  28. <dependency>  
  29.     <groupId>commons-logging</groupId>  
  30.     <artifactId>commons-logging</artifactId>  
  31.     <version>1.1.3</version>  
  32. </dependency>  
  33. <dependency>  
  34.     <groupId>log4j</groupId>  
  35.     <artifactId>log4j</artifactId>  
  36.     <version>1.2.17</version>  
  37. </dependency>       
  38.  -->  

    加了几个重要的实现适配器,log4j-over-slf4j,log4j-over-slf4j,jul-to-slf4j。然后jboss-logging部分也进行了统一的版本控制。同时删除及exclude掉所有log4j,commons-logging的各个版本。适配器和具体日志实现,不能共存,否则适配器不生效。这样的话,我们只有logback配置文件即可,因为log4j的输出已经委托给了slf4j(通过log4j-over-slf4j),而slf4j的默认实现是logback。 
其中JUL需要额外执行一行初始化代码 
Java代码  收藏代码
  1. SLF4JBridgeHandler.install();// jul to slf4j  


常见错误调试 
【错误1】只是一个典型错误,主要是错误的第二行红色部分 
log4j:WARN No appenders could be found for logger (com.mchange.v2.log.MLog). 
log4j:WARN Please initialize the log4j system properly. 
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. 
出现此错误是由于没有log4j配置文件导致。在classpath下添加log4j.xml,并做一些配置即可。配置完以后,启动输出 
2014-02-25 09:30:31:743[INFO ][com.mchange.v2.log.MLog.<clinit>(MLog.java:80)] - MLog clients using log4j logging. 
2014-02-25 09:30:31:780[INFO ][com.mchange.v2.c3p0.C3P0Registry.banner(C3P0Registry.java:204)] - Initializing c3p0-0.9.1.2 [built 21-May-2007 15:04:56; debug? true; trace: 10] 
即表示回复正常 
。例如我的配置文件如下 
log4j.xml 
Xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">  
  3. <log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>  
  4.     <appender name="console" class="org.apache.log4j.ConsoleAppender">  
  5.         <layout class="org.apache.log4j.PatternLayout">  
  6.             <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss:SSS}[%-5p][%l] - %m%n" />  
  7.         </layout>  
  8.     </appender>  
  9.     <logger name="org.springframework" additivity="false">  
  10.         <level value="info" />  
  11.         <appender-ref ref="console" />  
  12.     </logger>  
  13.     <root>  
  14.         <level value="info" />  
  15.         <appender-ref ref="console" />  
  16.     </root>  
  17. </log4j:configuration>  
java日志框架:slf4j、jul(java.util.logging)、 log4j、 logback SLF4J (Simple Logging Facade for Java) 是一个为各种 Java 日志框架提供简单统一接口的库。它的主要目的是将应用程序代码与具体的日志实现解耦,使得在不修改应用程序代码的情况下,可以轻松地切换不同的日志框架。 阅读详情

相关推荐

几种志框架:Log4j Log4j2 SLF4J logback和Apache Commons Logging的比较

作为Java开发人员,对于日志记录框架一定非常熟悉。而且几乎在所有应用里面,一定会用到各种各样的日志框架用来记录程序的运行信息。而对于一个成熟的Java应用,这个是必不可少的。在开发和调试阶段,日志可以帮助我们更快的定位问题;而在应用的运维过程中,日志系统又可以帮助我们记录大部分的异常信息,通常很多企业会通过收集日志信息来对系统的运行状态进行实时监控预警。 总体概览 image.png 目前的日志框架有JDK自带的logging,log4j1、log4j2、logback ,这些框架都自己定制了.

qq_33449307的博客 1438

java日志框架

java日志框架日志体系历史如何使用bridge只引入slf4j-api.jar包slf4j和logback组合slf4j和log4j组合slf4j和jdk组合slf4j和simple组合slf4j和nop组合引入jcl包jcl和log4j组合重定向jcl转slf4j死循环归纳后记 java日志框架 对于一个系统来说日志是必不可少的一部分,线上问题跟踪,基于日志的业务逻辑统计分析等都离不日志。记...

我翱翔的天空 1219

6.2 SpringBoot日志入门实战 SLF4J + Logback

如果你是一位Java开发者,那么你肯定知道Log日志的重要性,它是我们了解程序内部运行真像,分析和定位问题的最直接手段!对于任何企业级的程序,日志记录是必须的!在SpringBoot框架中,集成了常用的日志框架,包括SLF4J、Logback、Log4j2、Java Util Logging等,其中,Logback是SpringBoot默认的日志框架,其它框架的集成方式大同小异,可以通过在pom.xml文件中添加相应的依赖来切换不同的日志框架。

天罡gg的专栏 1911

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

log4j-slf4j-impl cannot be present with log4j-to-slf4j 这个错误的意思是 log4j-slf4j-impl 和 log4j-to-slf4j 这两个包不能同时存在。 那么为什么这两个包不能同时存在呢?我们先来看一下这两个包的定义: log4j-slf4j-impl The Apache Log4j SLF4J API binding to Log4j 2 Core log4j-to-slf4j The Apache Log4j binding betw

ttyy1112的专栏 4万+

log4j-to-slf4j:从 Log4j 迁移到 SLF4J 的实用程序。 它还将 Log4j 日志消息转换为 SLF4J 日志消息

介绍 这是一个简单的实用程序,可用于将 Log4j 格式的日志语句转换为 SLF4J 格式的日志语句。 示例输入是: logger.info("Hello " + who); 将转换为: logger.info("Hello {}", who); 先决条件 您应该安装了 Python 2.7.x。 假设您使用的是具有可变参数支持的 SLF4J 1.7 或更高版本。 怎么跑? 运行这个脚本非常容易。 只需使用文件名作为参数调用脚本。 log4jtoslf4j.py ExampleInput.java 原始输入文件将以 .orig 扩展名保存。 您可以提供多个输入文件作为参数。 重要笔记 假设您的记录器被命名为 log 或 logger(不区分大小写)。 如果您以任何其他方式命名记录器,请修改全局变量 LOGGER_NAMES,它应该可以工作。 建议您仅对已签入的文件运行转

【低空经济】低空无人机公共测试场与验证基地设计方案

公共测试场与验证基地是为低空无人机相关技术的研发、测试与应用提供一个系统性的平台。在无人机产业蓬勃发展的背景下,建设一个配备完善、功能齐全的公共测试场与验证基地显得尤为重要。该基地不仅可以作为无人机的测试和验证场地,还可以为相关企业、科研机构以及政府部门提供技术支持和服务。因此,为此基地的设计方案必须综合考虑功能性、安全性、灵活性与可持续性等多方面的因素。首先,公共测试场需划分为多个专用区域,以便满足不同类型无人机的测试需求。这包括低空飞行区域、紧急着陆区、操控模拟区和监测与数据采集区等。

2502_92579126的博客 1603

Apache Log4j曝史诗级漏洞,Spring boot修复教程

全球知名开源日志组件Apache Log4j被曝存在严重高危险级别远程代码执行漏洞,攻击者可以利用该漏洞远程执行恶意代码。据阿里云通报,由Apache Log4j2某些功能存在递归解析功能,攻击者可直接构造恶意请求,触发远程代码执行漏洞。 该漏洞于12月7日由游戏平台Minecraft用户在网上曝光,据称黑客可以通过操作日志消息(甚至在聊天信息中键入内容),并且还可以在Minecraft服务器端执行恶意代码。Apache log4j官方在7日当天便发布2.15.0-rc1版本以修复漏洞,随后,阿里云、斗象

chechengtao 7336

蓝桥杯单片机学习13——NE555方波发生器&频率测量

NE555详解、引脚图介绍、原理图及工作原理讲解、方波产生的原理、定时器测量频率的原理及使用方法、代码实现

weixin_67907028的博客 1万+

最详细、最全面的【Java日志框架】介绍,建议收藏,包含JUL、log4j、logback、log4j2等所有主流框架

本文为 【Java日志框架】 相关知识,对日志的概念与作用,JUL日志框架,Log4j日志框架,Logback日志框架,Log4j2日志框架,日志门面如Slf4j日志门面、JCL日志门面等进行详尽介绍~

小新要变强的博客 3920

新手如何结合pbootCMS和宝塔面板快速构建网站

摘要: 新手可通过pbootCMS(轻量CMS)和宝塔面板(可视化工具)快速搭建网站,无需命令行。步骤包括:1) 准备服务器(Linux/CentOS7.x)和域名;2) 安装宝塔面板并配置LNMP环境(PHP7.4+MySQL5.7);3) 创建网站目录,上传并解压pbootCMS源码,设置文件权限;4) 运行安装向导,填写数据库信息和管理员账号;5) 测试前台/后台功能,优化性能并绑定域名。全程约30-60分钟,宝塔简化运维,pbootCMS便于内容管理,适合零基础用户。注意定期更新和备份以保障安全。

qinzhenyan的博客 1643

基于Transformers库的BERT模型:一个文本情感分类的实例解析

简介 本文来讲述BERT应用的一个例子,采用预训练好的BERT模型来进行演示。BERT的库来源于Transformers,这是一个由PyTorch编写的库,其集成了多个NLP领域SOTA的模型,比如bert、gpt-2、transformer xl等,并且可以自由选择已经预训练好的模型参数,我们可以基于这些参数进行进一步的训练调试。 Part 1: 利用BERT基于特征的方式进行建模 1、任务与数...

蓝天白云梦的csdn博客 2万+

快速了解常用日志技术(JCL、Slf4j、JUL、Log4j、Logback、Log4j2)

常见的日志门面 : JCL、slf4j 常见的日志实现: JUL、log4j、logback、log4j2

lydms的博客 1万+

rk3568 Android12 增加 USB HOST 模式开关(二)

将原有 USB-C 改为 USB-A,并在设置中增加USB工作模式开关可以让用户选择USB端口的功能模式,例如充电、文件传输、或MIDI设备。用户能够灵活管理设备的连接方式,优化数据传输和设备兼容性。

weixin_35723192的博客 735

log4j 、logback 以及slf4j三者之间的关系

在项目的开发中由于对于log4j、logback以及slf4j之间的关系和相关的知识不能清晰掌握,在业余时间进行记录。 1、三者之间的关系  1)   简答的讲就是slf4j是一系列的日志接口,而log4j logback是具体实现了的日志框架。   因为是接口,所以在项目中如果你不引用log4j 、logback或者其它日志框架你会发现,由于没有给出具体的logger实现,   控制台...

weixin_34310127的博客 3092

100天精通Python(可视化篇)——第109天:Pyecharts绘制各种常用地图(参数说明+代码实战)

100天精通Python(可视化篇)——第109天:Pyecharts绘制各种常用地图(参数说明+代码实战)

努力让自己发光,对的人才能迎着光而来 8万+

YOLOv11的物理信息神经网络(PINN):引入物理规律约束目标运动预测

本文介绍了YOLOv11目标检测与PINN物理信息神经网络的融合技术。YOLOv11采用增强特征提取和参数优化架构,在保持实时性的同时提升检测精度。PINN通过将物理方程嵌入损失函数,实现数据高效学习。两者的结合可显著提升运动预测准确性和遮挡处理鲁棒性。文章详细阐述了环境配置、YOLOv11模型验证方法,并提供了基础PINN框架代码实现,展示了物理约束如何通过自动微分整合到神经网络中。该融合技术适用于自动驾驶、无人机导航等需要物理规律建模的视觉感知场景。

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 424

SLF4j的介绍与使用+SpringBoot日志配置

slf4j,simple logging facade for java的缩写,翻译为java的简单日志外观。slf4j(simple logging facade for java)不是一个真正的日志实现,而是一个抽象层( abstraction layer),也可以理解为一个接口,它是一种适配器的实现方式,它本身不具有输出日志的功能,输出日志还是由log4j、logback等这样的日志组件来进行输出。

weixin_44320429的博客 1万+

YOLO 线性小目标涨点|3890 张输电导线散股 VOC+YOLO 单类别数据集实战,无人机电力缺陷巡检全流程落地

架空输电导线是电网能量传输核心载体,长期受风力摆动、雷击、腐蚀、外力撞击作用,外层铝股极易出现断裂散股故障。导线散股初期仅少量铝丝开裂,肉眼与无人机远距离航拍下属于细长微弱线性小目标;若未及时发现,散股会持续扩张,引发导线过热、断线、大面积停电重大电力安全事故。传统人工巡检存在多重行业痛点:山区、跨江河线路人员无法攀爬登杆,高空作业人身坠落风险极高;无人机单次航拍产出数千张高清图片,人工逐帧筛查微小散股耗时 3-5 天,阴天、逆光、植被遮挡场景漏检率超 45;

lin_xiu的博客 53

Java工具05-Java日志框架:Log4j与Logback

摘要: Log4j与Logback是Java生态主流的日志框架。Log4j 2作为Apache项目,支持插件架构和异步日志,适合高性能场景;Logback由Log4j创始人开发,与SLF4J深度集成,配置更简洁。两者均支持分层日志、多格式输出和动态配置,但Log4j 2在异步处理和大规模日志场景表现更优,而Logback在Spring生态中集成更顺畅。开发者可根据项目需求(如性能、生态兼容性)选择框架,现代Java项目常通过SLF4J抽象层实现灵活切换。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【Log4j2】SLF4j的介绍与使用+SpringBoot日志配置

slf4j,simple logging facade for java的缩写,翻译为java的简单日志外观。slf4j(simple logging facade for java)不是一个真正的日志实现,而是一个抽象层( abstraction layer),也可以理解为一个接口,它是一种适配器的实现方式,它本身不具有输出日志的功能,输出日志还是由log4j、logback等这样的日志组件来进行输出。

weixin_44823875的博客 6501

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Java日志体系框架总结:JUL、JCL、SLF4J、Log4j、Logback、Log4j2

Java日志概述、日志级别Level、Java Util Logging、JULI、tomcat-juli、tomcat-embed-logging-juli、Jakarta Commons Logging、Apache Commons Logging、SLF4J、静态绑定、桥接、SLF4J vs Commons Logging;Log4j、GAV变更;Logback、性能对比;Log4j2、性能对比、原理;实战:Log4j、Logback、Lombok。 问题:程序包org.slf4j不存在、ClassN

lonelymanontheway的博客 1538

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

上一篇: JCL-Over-SLF4J+SLF4J+Logback 使用方式
下一篇: http://ibatis.apache.org/dtd/ibatis-3-config.dtd Cause: java.net.ConnectException: Connection timed
zljjava
博客等级 码龄15年 155粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值