57. 【Java】日志框架:SLF4J与Logback

springboot日志依赖slf4j分析和logback-spring.xml的配置举例子分析 文章目录一、写在前面二、什么是slf4j2.1 什么是slf4j2.2 slf4j、logback和log4j的关系2.3 在springboot中使用slf4j+logback日志框架 一、写在前面 首先,推荐一篇优秀的介绍slf4j的优秀文章 https://juejin.im/post/5c7e2445f265da2de71370f2 springboot的默认日志依赖为slf4j。 本文的特点是会举很多通俗易懂的例子,让大家通过例子来学习使用slf4j。 二、什么是slf4j 2.1 什么是slf4 阅读详情

摘要: 本文系统介绍Java日志框架SLF4J+Logback的核心概念与实战应用。从日志框架的必要性出发,对比System.out.println()的局限性,详细讲解SLF4J门面模式的优势、Logback配置方法、日志级别控制、文件输出策略以及异步日志优化。通过完整示例演示如何在项目中集成日志记录,并分享日志最佳实践,帮助开发者构建可维护、高性能的日志系统。

关键词: SLF4J, Logback, Java日志, 日志框架, 日志配置


在上一篇文章中,我们学习了 JUnit 5 单元测试,你知道了如何用自动化测试来验证代码的正确性。现在你的代码有了质量保障,跑起来也放心多了。

但还有另一个问题:程序运行的时候,到底发生了什么?

如果你的程序出了 bug,用户说“点了一下按钮,页面没反应”,你怎么知道问题出在哪里?如果是在本地开发,你可以加断点调试;但如果程序已经部署到了服务器上,你没法用 IDE 连上去调试。这时候,你需要的是一份运行日志(Log)——程序在执行过程中留下的“脚印”,它记录了什么时候发生了什么、数据是什么、结果是什么。

日志就像是飞机上的黑匣子。飞机正常飞行时你不需要它,但一旦出了事故,它是你还原真相的唯一线索。

今天,我们就来学习 Java 开发中最主流的日志框架组合:SLF4J + Logback。


1. 为什么需要日志框架?—— System.out.println() 为什么不够用?

在之前的文章中,我们大量使用了 System.out.println() 来输出调试信息。在学习和实验阶段,这完全没问题。但在真实项目中,System.out.println() 有太多硬伤:

  • 无法控制级别:你没法说“只输出 WARN 级别以上的日志”,所有 println 都会打印,不管是调试信息还是错误信息。
  • 无法关闭:生产环境上线后,大量的调试日志会把磁盘写满,而且会让程序变慢。
  • 无法分类:所有输出都混在一起,你不知道哪条是来自哪个模块。
  • 无法持久化:输出到控制台的内容,一旦滚动就消失了,没法回溯。
  • 无法格式化:你没法统一加上时间戳、线程名、类名等上下文信息。

而一个成熟的日志框架能帮你解决所有这些痛点:

  • 分级输出:TRACE、DEBUG、INFO、WARN、ERROR,你可以配置只输出某个级别以上的日志。
  • 灵活配置:开发环境输出到控制台,生产环境输出到文件,甚至可以输出到远程服务器。
  • 分类管理:你可以为不同的包或类设置不同的日志级别。
  • 持久化:日志被写入文件,可以按天滚动、压缩、归档,长期保存。
  • 统一格式:自动包含时间戳、线程名、类名、行号等上下文信息。
  • 性能优化:异步写入、条件编译等机制,保证日志记录对程序性能的影响最小。

打个比方:System.out.println() 就像你在纸上随手写笔记,随写随丢;而日志框架就像一本有目录、有分页、有日期、可归档的专业日志本。


2. Java 日志生态 —— 一个“绕来绕去”的故事

Java 的日志框架生态有点复杂,初学者往往会被各种名字搞晕:java.util.logging、Log4j、Log4j 2、Logback、SLF4J、Commons Logging……它们之间是什么关系?

让我用一个简短的“历史故事”帮你理清思路:

  1. JDK 1.4(2002年):Java 自带了 java.util.logging(JUL),但功能比较弱,使用也不方便。
  2. Log4j(2001年):一个第三方日志框架,功能强大,被广泛采用,成为事实标准。
  3. Commons Logging(JCL,2003年):Apache 推出的日志门面(Facade),它本身不实现日志,而是提供一个统一的 API,底层可以切换为 Log4j 或 JUL。
  4. SLF4J(2005年):Simple Logging Facade for Java,一个更现代的门面框架,比 Commons Logging 设计更好,支持占位符 {}。
  5. Logback(2006年):Log4j 的作者(Ceki Gülcü)后来“升级”了 Log4j 的设计,写出了 Logback。Logback 原生实现了 SLF4J 接口,是 SLF4J 的最佳搭档。
  6. Log4j 2(2014年):Apache 对 Log4j 进行了重写,Log4j 2 也支持 SLF4J,但更复杂一些。它在某些场景下性能有优势,但配置也比较复杂。

今天的最佳实践是什么?

绝大多数现代 Java 项目使用 SLF4J(门面)+ Logback(实现) 这个组合。它简单、稳定、配置灵活,而且在 Spring Boot 中是默认集成的。

💡 门面模式的好处:你的代码只依赖 SLF4J 的 API,底层的日志实现可以随时替换(从 Logback 换成 Log4j 2,或者换成别的),而你的业务代码不需要改动。


3. SLF4J + Logback —— 快速上手

3.1 添加依赖

在 Maven 项目中,只需要添加以下依赖(Spring Boot 项目已经默认包含):

<dependencies>
    <!-- SLF4J API -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>2.0.13</version>
    </dependency>
    
    <!-- Logback 实现 -->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.5.6</version>
    </dependency>
</dependencies>

logback-classic 已经包含了 logback-core,所以不需要单独添加。

3.2 最简单的使用

在你的类中,通过 LoggerFactory 获取一个 Logger 实例,然后就可以记录日志了:

package com.example.demo;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LogDemo {
    // 每个类创建一个 Logger(通常用当前类的全限定名)
    private static final Logger logger = LoggerFactory.getLogger(LogDemo.class);

    public static void main(String[] args) {
        // 不同级别的日志
        logger.trace("这是 TRACE 级别的日志");
        logger.debug("这是 DEBUG 级别的日志");
        logger.info("这是 INFO 级别的日志");
        logger.warn("这是 WARN 级别的日志");
        logger.error("这是 ERROR 级别的日志");

        // 带参数的日志(使用占位符 {})
        String name = "张三";
        int age = 25;
        logger.info("用户 {} 的年龄是 {} 岁", name, age);

        // 记录异常信息
        try {
            int result = 10 / 0;
        } catch (Exception e) {
            logger.error("计算发生异常", e);
        }
    }
}

运行这段代码,你会看到类似这样的输出(取决于日志配置):

11:30:45.123 [main] INFO com.example.demo.LogDemo - 这是 INFO 级别的日志
11:30:45.124 [main] WARN com.example.demo.LogDemo - 这是 WARN 级别的日志
11:30:45.124 [main] ERROR com.example.demo.LogDemo - 这是 ERROR 级别的日志
11:30:45.124 [main] INFO com.example.demo.LogDemo - 用户 张三 的年龄是 25 岁
11:30:45.125 [main] ERROR com.example.demo.LogDemo - 计算发生异常
java.lang.ArithmeticException: / by zero
    at com.example.demo.LogDemo.main(LogDemo.java:25)

默认情况下,Logback 只输出 INFO 级别及以上的日志,所以 TRACE 和 DEBUG 没有显示。

3.3 为什么用占位符 {} 而不是字符串拼接?

很多新手会写成:

// ❌ 不推荐
logger.info("用户 " + name + " 的年龄是 " + age + " 岁");

而推荐写成:

// ✅ 推荐
logger.info("用户 {} 的年龄是 {} 岁", name, age);

原因在于性能:如果当前日志级别是 WARN,那么 INFO 级别的日志根本不会被输出。但如果用字符串拼接,Java 仍然会先执行拼接操作(即使最后日志没有被记录),造成性能浪费。而占位符方式会先检查日志级别,决定是否需要执行参数替换,所以更加高效。


4. 日志配置 —— logback.xml / logback-spring.xml

Logback 的配置非常灵活。你可以在 src/main/resources 目录下创建一个 logback.xml 或 logback-spring.xml 文件来控制日志的行为。

在 Spring Boot 项目中,建议使用 logback-spring.xml,因为 Spring Boot 会对它做额外的处理(比如支持 profile 配置)。

一个最基本的 logback.xml 配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 控制台输出配置 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <!-- 日志格式 -->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 根日志级别:所有日志至少为 INFO -->
    <root level="INFO">
        <appender-ref ref="CONSOLE" />
    </root>
</configuration>

这个配置让日志输出到控制台,格式包含时间、线程、级别、类名和消息。


5. 日志级别 —— 控制记录的“精细度”

Logback 定义了五个日志级别(从低到高):

级别用途何时使用
TRACE最详细的追踪信息非常细粒度的调试,比如跟踪一个请求的完整流程
DEBUG调试信息开发调试时输出变量值、方法进入/退出等
INFO常规信息重要的业务事件(用户登录、订单创建、服务启动)
WARN警告潜在问题,但程序还能继续运行(比如使用旧的配置)
ERROR错误运行时异常、业务失败(比如支付失败)

配置级别:你可以为不同的包设置不同的级别。例如:

<!-- 把 com.example 包的级别设为 DEBUG -->
<logger name="com.example" level="DEBUG" />

<!-- 把 org.springframework 包的级别设为 WARN,减少 Spring 的噪音 -->
<logger name="org.springframework" level="WARN" />

<!-- 根级别设为 INFO -->
<root level="INFO">
    <appender-ref ref="CONSOLE" />
</root>

这样,com.example 下的日志会输出 DEBUG 及以上级别的日志,而 Spring 的日志只输出 WARN 及以上级别,既不影响调试,又不会被 Spring 的日志淹没。


6. 日志输出到文件 —— 持久化存储

在实际项目中,控制台日志通常只用于开发和调试。生产环境需要把日志写入文件,方便长期保存和检索。

<!-- 文件输出配置 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <!-- 日志文件路径 -->
    <file>logs/myapp.log</file>
    
    <!-- 日志格式 -->
    <encoder>
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
    
    <!-- 滚动策略:按天滚动 -->
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <!-- 每天生成一个日志文件,压缩归档 -->
        <fileNamePattern>logs/myapp.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
        <!-- 保留 30 天的日志 -->
        <maxHistory>30</maxHistory>
    </rollingPolicy>
</appender>

<root level="INFO">
    <appender-ref ref="CONSOLE" />
    <appender-ref ref="FILE" />
</root>

这样配置后,日志会写入 logs/myapp.log 文件,每天凌晨自动滚动生成一个新的文件,同时把旧的日志压缩成 .gz 文件归档,最多保留 30 天。


7. 常见的日志配置模式

7.1 开发环境 vs 生产环境

在 Spring Boot 项目中,你可以根据 profile 使用不同的配置:

<!-- logback-spring.xml -->
<configuration>
    <!-- 开发环境:DEBUG 级别,彩色输出 -->
    <springProfile name="dev">
        <root level="DEBUG">
            <appender-ref ref="CONSOLE" />
        </root>
    </springProfile>

    <!-- 生产环境:INFO 级别,输出到文件 -->
    <springProfile name="prod">
        <root level="INFO">
            <appender-ref ref="FILE" />
        </root>
    </springProfile>
</configuration>
7.2 异步日志 —— 提升性能

日志写入文件是一个 I/O 操作,如果同步写入,每个日志记录都要等待磁盘写入完成,会拖慢业务线程。Logback 提供了 AsyncAppender,让你异步写入日志,业务线程只需要把日志放进内存队列,由后台线程负责写入。

<appender name="ASYNC_FILE" class="ch.qos.logback.classic.AsyncAppender">
    <appender-ref ref="FILE" />
    <!-- 队列大小 -->
    <queueSize>512</queueSize>
    <!-- 如果队列满了,是否丢弃日志(true=丢弃,false=阻塞业务线程) -->
    <discardingThreshold>0</discardingThreshold>
</appender>

<root level="INFO">
    <appender-ref ref="ASYNC_FILE" />
</root>

异步日志在高并发场景下能显著提升性能,但需要权衡日志丢失的风险(极端情况下队列满了会丢弃日志)。


8. 在代码中优雅地使用日志

8.1 使用 @Slf4j 注解(Lombok)

如果你使用 Lombok,可以省去手动声明 Logger 的样板代码:

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class MyService {
    public void doSomething() {
        log.info("执行 doSomething 方法");
        // 直接使用 log 变量,不需要手动声明
    }
}

⚠️ 注意:使用 Lombok 需要在 pom.xml 中添加 Lombok 依赖,并在 IDEA 中安装 Lombok 插件。

8.2 日志的最佳实践

✅ 推荐做法:

  1. 记录有意义的上下文信息:不只是 "登录失败",而是 "用户 {} 登录失败,原因:{}",包含用户名和错误原因。
  2. 异常一定要记录完整的堆栈:logger.error("操作失败", e),而不是 logger.error("操作失败:" + e.getMessage())。
  3. 使用 isDebugEnabled() 保护昂贵的日志构造:
    if (logger.isDebugEnabled()) {
        logger.debug("复杂的调试信息: {}", expensiveToString());
    }
    
  4. 统一使用 SLF4J API:保持代码中只有 org.slf4j.Logger 的引用,避免直接依赖具体实现。
  5. 合理使用日志级别:DEBUG 用于开发和测试,INFO 用于重要的业务事件,WARN 用于可恢复的问题,ERROR 用于需要人工介入的错误。

❌ 避免的做法:

  1. 记录敏感信息:密码、身份证号、银行卡号、Token 等,绝对不能出现在日志中。
  2. 在循环中记录大量日志:尤其是 DEBUG 级别的日志,在循环中输出会严重影响性能。
  3. 吞掉异常:catch (Exception e) { } 而不记录任何日志,会让问题无法追踪。
  4. 用 System.out.println() 代替日志:在正式项目中,所有输出都应该走日志框架。

9. 综合示例 —— 在“图书管理系统”中集成日志

我们把之前写的图书管理系统改造一下,加入日志记录。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LibraryService {
    private static final Logger logger = LoggerFactory.getLogger(LibraryService.class);

    public Book borrowBook(String userId, String isbn) 
            throws BookNotFoundException, BookNotAvailableException {
        logger.info("用户 {} 尝试借阅图书 {}", userId, isbn);
        
        // ... 业务逻辑 ...
        
        if (bookNotFound) {
            logger.warn("用户 {} 借阅失败,图书 {} 不存在", userId, isbn);
            throw new BookNotFoundException(isbn);
        }
        
        if (!book.isAvailable()) {
            logger.warn("用户 {} 借阅失败,图书 {} 库存不足", userId, isbn);
            throw new BookNotAvailableException(isbn);
        }
        
        // 借阅成功
        logger.info("用户 {} 成功借阅图书 {}", userId, isbn);
        return book;
    }

    public void returnBook(String userId, String isbn) {
        logger.info("用户 {} 归还图书 {}", userId, isbn);
        // ... 归还逻辑 ...
        logger.info("用户 {} 归还图书 {} 成功", userId, isbn);
    }
}

配置日志级别为 INFO 时,INFO、WARN、ERROR 会被记录,DEBUG 和 TRACE 被忽略。当需要深入调试时,可以把 com.example.library 包的级别临时改成 DEBUG,就能看到更详细的日志了。


10. 日志框架的演进与 JDK 21

在 JDK 21 中,日志框架没有大的变化,但有两个值得注意的点:

  1. 系统模块(System Logger):JDK 内部使用了 System.Logger API,它提供了一个统一的接口,可以把 JDK 内部的日志桥接到 SLF4J 等框架中。
  2. 虚拟线程的日志:在虚拟线程中,日志格式中的 [thread] 会显示虚拟线程的名称,你可以给虚拟线程命名来增强可读性:
    Thread vt = Thread.ofVirtual().name("vt-request-", 0).start(() -> {
        logger.info("处理请求...");  // 会显示虚拟线程名
    });
    

11. 今天的总结

今天我们学习了日志框架:

  • 为什么需要日志:System.out.println() 无法满足生产环境的需求,需要分级、可配置、可持久化的日志框架。
  • SLF4J + Logback:当前最主流的组合,SLF4J 是门面(API),Logback 是实现。
  • 日志级别:TRACE < DEBUG < INFO < WARN < ERROR,可以精细控制输出内容。
  • 配置:通过 logback.xml 配置控制台输出、文件输出、滚动策略、异步日志。
  • 最佳实践:
    • 使用占位符 {} 而不是字符串拼接。
    • 记录异常时包含完整堆栈。
    • 不要记录敏感信息。
    • 使用 @Slf4j 注解简化声明。
  • 虚拟线程日志:虚拟线程名称会自动显示在日志中,增强可读性。

日志是程序的“黑匣子”,也是运维人员的“眼睛”。学会正确使用日志框架,你在排查问题时会有完全不一样的体验——不再是“猜哪里出了问题”,而是直接看日志文件里的记录,精准定位。


动手试试

  1. 在你现有的项目中添加 SLF4J + Logback 依赖,把 System.out.println() 替换成日志记录。
  2. 配置一个 logback.xml,让日志同时输出到控制台和文件,并设置不同的日志级别。
  3. 写一个包含多个包的项目,为不同的包设置不同的日志级别(比如 com.example.core 为 DEBUG,com.example.web 为 INFO)。
  4. 在你的代码中故意抛出一个异常,用 logger.error("出错啦", e) 记录,观察日志中是否包含完整的堆栈。
  5. 尝试配置异步日志,观察在高频日志输出时的性能表现(可以用 JMH 测试,或者简单对比同步和异步的吞吐量)。

下一篇文章,我们将学习 JDBC —— Java 与数据库的桥梁,让你的程序能够持久化地存储和查询数据。

我们下一篇见。😃

📌 获取本系列示例代码请访问 GitCode。

基于SSM框架的校园快递物流管理系统设计与实现 信息管理系统(MIS)是计算机软件工程领域的核心应用之一,它通过将业务流程数字化、标准化来提升管理效率。其基本原理是采用分层架构,将数据持久化、业务逻辑和用户界面分离,以实现高内聚、低耦合的系统设计。在技术层面,Java Web开发中的SSM框架整合(Spring、Spring MVC、MyBatis)是构建此类系统的成熟方案,它通过依赖注入、面向切面编程和对象关系映射等技术,简化了企业级应用的开发流程,具有提升开发效率、保证事务一致性和便于团队协作的重要价值。典型的应用场景包括电商后台、OA办公系统以及各 阅读详情

相关推荐

信息奥赛课课通(C++)p154-1近似排序

试题描述 读入一对正整数,将这两个数之间(包括这两个数本身)的所有数按下述特别规则排序后输出,该特别规则是按两数倒过来的值进行比较决定其大小,如30倒过来为3,29倒过来为92,则29大于30. 输入要求 1行,包含两个用空格隔开的自然数,这两个自然数给出了待排序数的范围,其中1≤第一个数≤第二个数≤999999999,两个数之差不超过100. 输出要求 输出排序后的数据,每行输出...

mengdicfm的博客 7279

SpringBoot2.x整合slf4j+logback日志框架

转自http://www.kongzid.com/archives/java2 ,SpringBoot对所有内部日志使用通用日志记录,但保留底层日志实现。为Java Util Logging、Log4J2和Logback提供了默认配置。在不同的情况下,日志记录器都预先配置为使用控制台输出,同时还提供可选的文件输出。默认情况下,SpringBoot使用Logback进行日志记录。

孔子说 2316

潜行游戏设计:核心机制与关卡设计解析

潜行游戏作为动作游戏的重要分支,通过视觉遮蔽、声音传播和AI行为树等复杂系统,为玩家提供独特的策略体验。视觉隐蔽系统采用视野锥和光照值的双重判定,声学传播模型模拟距离衰减和材质穿透,而敌人AI行为树则包含巡逻、警戒和团队协作等状态节点。这些技术不仅提升了游戏的真实感和挑战性,还在《合金装备》《刺客信条》等经典作品中得到广泛应用。潜行游戏的关卡设计强调多路径拓扑结构和环境叙事元素,通过沙漏模型和动态难度调节,平衡自由度和开发成本。未来,基于ML的适应性AI和物理模拟的隐蔽系统将成为创新方向。

weixin_42497762的博客 179

【解决】SLF4J: Class path contains multiple SLF4J bindings.

【解决】SLF4J: Class path contains multiple SLF4J bindings. 在启动springboot项目时,遇到了这个问题,上网查询多个方案,最终这个方法得到解决 问题描述: SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/D:/Program%20Files/JavaEclipse/repo/ch/qos/logback/logback-cla

HKD的博客 8万+

立创电赛C题:基于STM32的三端口DC-DC变换器设计与MPPT算法实现

本文详细解析了2021年立创电赛C题——基于STM32的三端口DC-DC变换器设计。文章从题目要求出发,系统阐述了采用双DC-DC电路(分别负责MPPT追踪与稳压)的硬件架构,并重点讲解了以STM32为核心、结合PID控制与扰动观察法(MPPT算法)的软件实现方案,为备赛者提供了完整的软硬件设计思路与调试经验。

weixin_42588877的博客 222

LLM之RAG实战(五十四)| 复杂文档处理RAG框架:Ragflow

RAGFlow 是一种结合了检索增强(Retrieval-Augmented Generation,RAG)与流程控制(Flow)的人工智能技术架构。它通过检索外部知识库中的信息,结合自然语言生成技术,为用户提供更准确、更丰富的回答。同时,它还引入了流程控制机制,能够根据任务需求动态调整信息检索和生成的流程,从而更好地完成复杂的任务。RAGFlow 的核心优势在于将检索和生成相结合,打破了传统生成模型仅依赖内部参数进行文本生成的局限。

wshzd的博客 1066

JAVA日志框架

JAVA日志的使用

weixin_48412846的博客 1503

MATLAB计算各种复合干热指数,如SDHI、DHMI等

MATLAB编程实现各种复合干热指数

WW、forever的博客 5079

springboot配置logback日志

一、概述: 参照官方文档:https://docs.spring.io/spring-boot/docs/2.2.11.RELEASE/reference/html/spring-boot-features.html#boot-features-logging ​ Spring Boot使用Commons Logging进行所有内部日志记录,但是使底层日志实现保持打开状态。提供了Java Util Logging,Log4J2和Logback的默认配置。在每种情况下,记录器都已预先配置为使用控

几多心跳 776

Python 爬虫实战:付费 IP 代理使用技巧与爬虫稳定性优化

付费IP代理实战指南:突破反爬与优化稳定性 本文系统讲解付费IP代理在爬虫项目中的高效应用方法。首先对比分析静态代理、动态代理和隧道代理的优缺点及适用场景,推荐高并发项目优先选择隧道代理。然后详细演示了主流代理服务商的集成方法,包括代理池的自动更新和健康检测机制。核心部分重点介绍了爬虫稳定性优化策略,如智能重试、频率控制和请求间隔优化等关键技术。最后通过压力测试验证优化效果,并提供成本控制方案,包括代理复用、错峰爬取等实用技巧。通过本教程,开发者可有效解决高并发爬虫中的IP封禁问题,显著提升系统稳定性和抗风

2503_91057718的博客 2449

[漏洞挖掘与防护] 03.漏洞利用之WinRAR安全缺陷复现(CVE-2018-20250)及软件自启动分析

上一篇文章将详细介绍MS08-067远程代码执行漏洞(CVE-2008-4250)及防御过程,它是Windows Server服务RPC请求缓冲区溢出漏洞,利用445端口,并通过Metasploit工具获取shell及进行深入的操作。这篇文章将详细讲解WinRAR漏洞(CVE-2018-20250),并复现了该漏洞和讲解了恶意软件自启动劫持原理。基础性文章,希望对入门的同学有帮助。

杨秀璋的专栏 1088

java org.slf.4j_java – ClassCastException:org.slf4j.impl.Log4jLoggerAdapter无法强制转换为ch.qos.logback.cla...

我正在关注this的答案,以便在运行时添加一个appender.即使这适用于原始海报,我也会在Logger logger =(Logger)LoggerFactory.getLogger(“abc.xyz”)中获得此异常;:java.lang.ClassCastException: org.slf4j.impl.Log4jLoggerAdapter cannot be cast to ch.qos...

weixin_35669769的博客 545

Data+AI━━数仓建模的智能进化之路!

Data+AI━━数仓建模的智能进化之路!

ith321的博客 1744

springboot 排除 默认的loggback 和slf4j的依赖

文章目录异常现象:解决方案:总结 异常现象: SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/D:/Program%20Files/JavaEclipse/repo/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J

Gblfy_Blog 4123

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【MyBatis-5】MyBatis日志管理:原理、配置与最佳实践

MyBatis的日志系统提供了强大的灵活性和扩展性,能够满足从开发调试到生产监控的各种需求。通过合理配置日志框架和级别,开发者可以获得足够的信息来诊断问题,同时避免日志过多带来的性能问题。理解MyBatis日志工作原理并掌握其配置技巧,是成为MyBatis高级开发者的重要一步。快速定位SQL相关问题优化数据访问性能构建更健壮的MyBatis应用有效管理生产环境中的数据库操作日志。

weixin_39033358的博客 1478

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

java日志服务器_java服务器搭建(一)日志系统

我是一个新入行的菜鸟,现在在做java服务器,在这里记录下服务器框架的主要构成,有任何不准确与错误的地方,希望看到的人提出意见。非常感谢!一、概述。1.1日志系统介绍。任何一个应用程序或者游戏的服务器日志系统都是必须的,日志系统的主要目的是:监视代码变量变化;记录服务器访问操作记录以及异常运行操作记录;进行部分统计分析工作;担当开发环境中调试器作用,输出代码调试信息。1.2 日志系统的选择。现在...

weixin_39653311的博客 981

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Apache OpenWhisk日志与监控:全方位掌握应用运行状态

Apache OpenWhisk是一款开源的无服务器云平台,其强大的日志与监控功能让您能够全面掌控应用运行状态。通过完善的日志系统和灵活的监控配置,您可以轻松追踪函数执行、排查问题并优化性能。🚀 ## 📊 日志系统深度解析 ### 默认日志配置 Apache OpenWhisk使用Logback作为默认日志提供程序,通过SLF4J接口实现。Logback的配置文件位于[common/sc

gitblog_01173的博客 814

Spring工程 使用日志

1.spring boot项目默认使用什么技术处理日志? 答:使用了log4j,使用log4j需要的配置:logback.xml配置文件和以下代码 1 private static final Logger log = LoggerFactory.getLogger(UserController.class); 1 log.debug("===================...

101

关于log4j换logback遇到的问题

04-Jun-2018 14:39:58.700 INFO [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log ContextListener: contextInitialized() 04-Jun-2018 14:39:58.700 INFO [localhost-startStop-1] org.ap...

qq_29984967的博客 526

Spring Boot 学习笔记(5):日志配置

官方文档: Spring Boot使用Commons Logging进行所有内部日志记录,但保留底层日志实现。为Java Util Logging,Log4J2和 Logback提供了默认配置 。在不同情况下,记录器都预先配置为使用控制台输出,并且还提供可选的文件输出。 默认情况下,如果使用“Starters”,则使用Logback进行日志记录。还包括适当的Logback路由,以确保使用Java ...

weixin_34208185的博客 495

LOG 引起的StackOverflowError

LOG 引起的StackOverflowError SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/logging/hcreport-datainf-i18n/lib/slf4j-log4j12-1.7.8.jar !/org/slf4j/impl/Sta

达文西的博客 6237

搭建ssm的踩坑之路(一)EhcacheCache、LoggingEhcache启动不起来

用惯了springboot感觉对ssm原始的搭配方式有点陌生了,决定动手搭建一次ssm框架,搭建好之后还原了一下,把一些踩坑记录写下来,用作参考。这次搭建使用到框架 spring + springmvc + mybatis + ehcache + druid ,然后用到 ehcache的时候出现了下面的bug见截图: 日志如下: Caused by: java.lang.NoClassDef...

成の博客 2135

(4)Spring Boot使用别的json解析框架【从零开始学Spring Boot】

此文章已经废弃,请看新版的博客的完美解决方案: 78. Spring Boot完美使用FastJson解析JSON数据【从零开始学Spring Boot】 http://412887952-qq-com.iteye.com/blog/2315202 【Spring Boot系列博客】 58. Spring Boot国际化(i18n)【从零开始学Spri...

weixin_33989780的博客 102

tess4j 找不到指定的模块_我得到“java.lang.UnsatisfiedLinkError:找不到指定的模块。”在APPIUM,我想验证吐司...

这是我的错误日志:java.lang.UnsatisfiedLinkError:找不到指定的模块。at com.sun.jna.Native.open(Native Method)at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:288)at com.sun.jna.NativeLibrary.getInstance(Nativ...

weixin_28221255的博客 2295

Spring AI + GPT-5.5 + Ollama 配置教程:Base URL、超时与流式调用

由于不同 Spring AI、Spring Boot 小版本之间仍可能存在差异,创建项目时应检查 Spring Initializr、Spring AI BOM 和官方兼容矩阵,不要直接复制旧教程中的 Starter 名称和版本号。多人项目最好隔离不同客户端,并在脱敏前提下记录最终 URL、状态码、请求耗时、请求 ID 和模型 ID。Spring AI 接入模型 API,至少要同时确认 Starter、Base URL、请求路径、API Key、模型 ID、连接超时、读取超时和流式客户端这 8 项。

2601_95893075的博客 215
上一篇: 56. 【Java】单元测试:JUnit 5 从入门到实践
下一篇: 58. 【Java】JDBC:Java与数据库的“桥梁“
gugucoding
博客等级 码龄140天 7粉丝 102原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值