背景
由于现在开源框架日益丰富,好多开源框架使用的日志组件不尽相同。为防止日志输出混乱,需统一处理。下图是各个日志框架的关系:
从上图中,我们可以看到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。"
完整日志配置:
<!-- log --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${org.slf4j-version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>${org.slf4j-version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>log4j-over-slf4j</artifactId> <version>${org.slf4j-version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jul-to-slf4j</artifactId> <version>${org.slf4j-version}</version> </dependency> <dependency> <groupId>org.jboss.logging</groupId> <artifactId>jboss-logging</artifactId> <version>3.1.4.GA</version> </dependency>
加了几个重要的实现适配器,log4j-over-slf4j,log4j-over-slf4j,jul-to-slf4j。然后jboss-logging部分也进行了统一的版本控制。同时删除及exclude掉所有log4j,commons-logging的各个版本。适配器和具体日志实现,不能共存,否则适配器不生效。这样的话,我们只有logback配置文件即可,因为log4j的输出已经委托给了slf4j(通过log4j-over-slf4j),而slf4j的默认实现是logback。
其中JUL需要额外执行一行初始化代码 :
相关推荐
需要注意的是,桥接器和绑定组件不能同时存在,因为它们可能会导致日志输出的循环引用问题。 在实际项目中,选择合适的日志系统和相应的绑定或桥接器是非常重要的。通常,考虑到性能和灵活性,`logback`与`SLF4J`的...
- 演示如何通过配置文件来管理这些 Bean 和它们之间的依赖关系。 #### 第四课:搭建 Spring 运行环境 - **步骤详解**: - **建立一个新的项目**:使用 IDE 或其他工具创建一个新的 Java 工程。 - **建立 Spring ...
Web程序通常包含多个库和组件,它们各自依赖于一系列JAR文件来提供必要的功能。本篇文章将深入探讨如何找出Web程序依赖的所有JAR文件,并通过分析给定的文件列表来揭示一些潜在的关联。 首先,我们要理解Web应用的...
10. **错误处理和日志记录**:在开发过程中,正确处理异常和记录日志是必不可少的。笔记可能包含如何配置错误页面,以及使用log4j等工具进行日志记录。 这份名为"方立勋JavaWeb视频前十一天笔记word版本(非常难得)...
- **IDE**:使用Eclipse、IntelliJ IDEA等Java开发工具,可以快速导入项目并进行开发。 - **日志系统**:如Log4j或Logback用于记录系统运行日志,方便调试和问题排查。 - **开发工具**:Postman用于测试RESTful ...
Dependency Finder就是这样一款利器,它可以帮助开发者梳理和理解项目的依赖结构,确保所有组件正确无误地协同工作。 Dependency Finder的核心功能主要包括: 1. **依赖分析**:该工具能够自动扫描指定的JAR文件或...
- **处理脏数据**:使用数据清洗工具,如Apache Beam或PySpark,根据业务需求定制清洗逻辑。 **3. 数据存储有哪些方式?请简要介绍每种方式的特点和适用场景。** - **关系型数据库**:适用于需要事务支持的应用。 ...
2. **构建工程**:使用提供的构建脚本或配置文件(如Makefile、CMakeLists.txt或build.gradle)来编译项目,熟悉编译过程和依赖关系。 3. **运行示例**:如果有示例程序,运行并分析它们的工作原理,这将加深对...
1. **代码审查**:首先,对出现错误的代码段进行细致的检查,确保所有的变量、函数和对象都在使用前已经被正确声明和初始化。这可能涉及到对整个项目的代码梳理,查找可能的遗漏。 2. **调试工具**:利用浏览器的...
Hadoop集群通常包括NameNode、DataNode、ResourceManager、NodeManager等多个组件,它们协调工作,管理数据存储和计算资源。Hadoop集群的启动通常涉及到启动HDFS和YARN(Yet Another Resource Negotiator)。启动...
在Android开发过程中,遇到错误是常态,理解和解决这些错误对于开发者来说至关重要。...在实践中,通过日志调试、使用Android Studio提供的分析工具,以及学习更多Android SDK文档,可以更好地应对各种错误。
从给定文件信息中,我们可以提取以下知识点: 1. Java类的继承与实例化 在Java中,类可以继承自另一个类,使用关键字extends来实现。在文档中的例子,类Dog...如果需要更准确的知识点梳理,请提供正确和完整的内容。
- **结构化日志**:使用日志库记录数据库操作,以便于调试和监控。 - **单元测试**:编写测试用例,验证数据库操作的正确性。 - **代码重构**:简化代码结构,提高可读性和可维护性。 - **最佳实践**:遵循Go...
- **编译过程**:使用之前安装的工具链对 uClinux 源代码进行编译,生成适合目标平台的可执行文件。 **3.4 运行 uClinux** - **运行方式**:通过仿真器或者实际硬件设备运行编译好的 uClinux 系统。 **3.5 实验:...
- **通过运行日志了解程序和状态变更**:介绍如何利用运行日志来监控程序执行过程中的变化,及时发现并解决问题。 #### 七、程序文件的使用 - **创建程序模块**:教授如何创建新的程序模块,便于管理和复用代码。 ...
### Jetty指导书知识点梳理 #### 一、Jetty简介 **1.1 Jetty功能介绍** Jetty是一个完全由Java编写的开源HTTP服务器及Web容器。它支持最新的HTTP协议和Java Servlet规范,并且能够作为一个独立的应用服务器运行,...