发布时间:2026/7/23 0:46:12
【Java EE】Spring 日志详解 文章目录一、日志的作用二、SpringBoot日志底层架构三、两种打印日志方式3.1 原生SLF4J3.2 Lombok Slf4j四、日志级别五、application全局配置5.1 配置日志级别yml配置properties配置5.2 日志持久化5.3 日志自动分割5.4 自定义日志输出格式六、完整yml配置一、日志的作用线上问题定位排查程序崩溃、接口报错、请求超时需要依靠日志复现定位是开发排障第一工具。系统运行监控记录接口响应耗时、调用频次、异常数量对接监控平台设置阈值告警。业务数据采集分析日志记录用户浏览、点击、停留行为统计PV/UV给推荐算法提供原始数据支撑运营策略优化。安全操作审计记录用户/管理员增删改查操作、敏感信息查询记录。出现数据泄露、恶意删改时可通过日志追溯操作人、操作时间满足等保、行业监管规范。二、SpringBoot日志底层架构门面模式是一种设计模式也称为外观模式提供了一个统一的接口用来访问子系统的一群接口门面模式主要包含两种角色外观角色(Facade)也称为门面角色是系统对外的统一接口子系统角色SubSystem可以同时有一个或多个SubSystem对于子系统来说Facade只是一个客户端即Facade对SubSystem透明日志框架这种日志框架就是门面模式的典型体现SLF4J不是真正的日志实现而是一个抽象层对日志框架制定的一种标准这样业务代码不用对接底层日志实现只对接SLF4J门面。业务代码只依赖SLF4J统一API底层可自由切换Logback/Log4j2无需改动业务代码项目所有第三方组件统一使用一套日志配置。三、两种打印日志方式3.1 原生SLF4Jimportorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RestController;RestControllerpublicclassLoggerController{// 绑定当前类日志输出会携带类名方便定位privatestaticfinalLoggerloggerLoggerFactory.getLogger(LoggerController.class);GetMapping(/print)publicStringprintLog(){// 不同级别日志输出logger.trace(追踪日志);logger.debug(调试日志);logger.info(正常业务日志);logger.warn(警告日志);logger.error(错误日志);return日志打印完成;}}3.2 Lombok Slf4j每次手动创建Logger对象重复繁琐Lombok一键生成日志对象log。importlombok.extern.slf4j.Slf4j;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RestController;Slf4j// 自动生成 Logger log 对象RestControllerpublicclassLogController{GetMapping(/log)publicStringtestLog(){log.info(用户访问日志接口);log.error(模拟异常报错);returnlombok日志输出;}}注解封装了创建log的过程四、日志级别FATAL ERROR WARN INFO DEBUG TRACE级别越高输出日志越少配置基础级别后只会打印当前级别及更高优先级日志。Logback无FATAL自动映射为ERROR。级别使用场景FATAL系统致命故障服务不可用需管理员紧急处理ERROR程序报错、异常不阻断整体服务运行WARN潜在风险不影响业务但需要关注INFO正常业务流程、启动、请求记录SpringBoot默认级别DEBUG开发调试细节生产环境关闭TRACE超细粒度追踪极少使用除非特殊用意一般使用DEBUG代替SpringBoot默认日志级别INFO访问接口只会打印INFO/WARN/ERRORDEBUG、TRACE不会输出。五、application全局配置5.1 配置日志级别yml配置在logging.level.root中可以设置全局的日志级别表示在显示这个级别及以上的日志信息与root同级别可以指定某个目录日志级别logging:level:root:debug# 全局根级别所有包生效com.example.demo:trace# 指定业务包打印TRACE日志properties配置logging.level.rootdebug logging.level.com.example.demotrace5.2 日志持久化控制台中的日志重启就会丢失要想持久化的保存日志有两种配置方式指定完整文件名优先级更高logging:file:name:logs/demo.log# 相对路径项目根目录logs文件夹指定存储目录logging:file:path:D:/server/logs# 绝对路径内容都会被识别为路径文件名为spring.log注意即使服务器重启这个文件也不会丢失新日志会追加在之前的日志后面name和path同时配置仅name生效。5.3 日志自动分割日志文件持续写入会膨胀为了防止防止单文件超大SpringBoot默认10MB自动分割。可自定义阈值、归档格式logging:logback:rollingpolicy:max-file-size:200MB# 单文件最大容量企业常用200~500Mfile-name-pattern:${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz# 分割后文件名demo.log.2026-07-21.0.gz%d{yyyy-MM-dd}按日期归档%i同一天多文件自增索引.gz自动压缩历史日志节省磁盘5.4 自定义日志输出格式日志内置字段%d{yyyy-MM-dd HH:mm:ss.SSS}精确毫秒时间%5p日志级别%t线程名%logger{39}打印类名%m日志内容%n换行自定义控制台和文件logging:pattern:# 控制台彩色日志console:%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5p) %clr([%t]){cyan} %-40logger : %m%n# 文件无彩色格式file:%d{yyyy-MM-dd HH:mm:ss.SSS} %5p [%t] %-40logger : %m%nSpring启动时有默认的日志输出六、完整yml配置logging:# 日志文件存储file:name:logs/demo-service.log# 日志级别控制level:root:infocom.example.demo:debugorg.springframework:warnorg.mybatis:warn# 日志滚动分割策略logback:rollingpolicy:max-file-size:200MBfile-name-pattern:${LOG_FILE}.%d{yyyy-MM-dd}.%i.gzmax-history:30# 保留30天历史日志# 自定义日志格式pattern:console:%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5p) %clr([%15.15t]){cyan} %-40.40logger{39} : %m%n%wExfile:%d{yyyy-MM-dd HH:mm:ss.SSS} %5p --- [%t] %-40.40logger{39} : %m%n%wEx

相关新闻

2026/7/23 0:46:12

鸿蒙 ArkTS 入门实战:清洁分区计时器的页面入口与状态切换

鸿蒙 ArkTS 入门实战:清洁分区计时器的页面入口与状态切换 前言 清洁分区计时器是一个基于 ArkTS 与 ArkUI 声明式 UI 的鸿蒙示例项目,入口页面位于 entry/src/main/ets/pages/Index.ets。 本文围绕项目当前代码展开,结合 清洁分区计时 场景…

2026/7/23 0:46:12

从零吃透XML映射文件|零基础入门完整学习指南(附实操案例)

哈喽大家好!今天给大家带来一篇纯零基础、保姆级的 XML 映射文件学习教程。很多初学开发的小伙伴,都会被 MyBatis、框架配置中的 XML 映射文件搞懵:标签看不懂、语法不会写、报错找不到原因。其实 XML 映射文件没有想象中复杂,它的…

2026/7/23 2:01:16

记一例 vibe coding + gcc bug 导致的线程池死锁问题

故事,哦不,事故,是这样的。 话说,那还是本人没有广泛使用 Agent 的落后时代,也是可以在 arena.ai 上与 claude opus 4.6 无限对话的美好时代。 有一天,我突发奇想,让 opus 4.6 帮我实现一个 C 线…

2026/7/23 2:01:16

90%的老板都搞错了:管理的内核不是规范化,而是业务化

很多管理者都陷入过一个致命误区:把管理的终点当成了起点。 他们痴迷于搭建完美的流程体系,沉迷于整齐划一的报表数据,将“规范化”奉为管理的终极真理。但现实往往是:流程越复杂,效率越低;规则越繁琐&…

2026/7/23 2:01:16

羽球搭子 HarmonyOS 实战(15):比赛 SessionStore 与状态恢复

一、状态恢复不是把一个对象写进磁盘 一场双打活动通常包含对局摘要、参与者、轮次、场地、每场比分、当前场次和尚未提交的建局草稿。用户在计分中途切到消息应用、系统回收进程,或者登录另一个账号后再回来,页面都应该恢复到正确上下文。只保存一个 a…

2026/7/23 2:01:16

LLM应用上线翻车记:5条badcase三轮回血,附线上真实打法

你辛辛苦苦搞了个LLM应用,上线第一天用户就反馈"答非所问"“编造事实”“格式混乱”。你打开日志一看,满屏的翻车记录,但根本不知道从哪开始修。 今天这篇文章,我从一个真实的场景切入:5条badcase如何通过三…

2026/7/22 9:29:13

Unity与Python本地通信:基于Flask的跨语言数据交换实战

1. 项目概述:为什么我们需要一个本地通信服务器?在游戏开发、数字孪生、仿真训练等众多领域,Unity作为强大的实时3D内容创作平台,其核心逻辑通常由C#驱动。然而,当我们需要进行复杂的数据分析、机器学习推理、科学计算…

2026/7/23 0:01:10

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/22 21:00:12

3个高效策略:快速掌握Axure中文界面配置

3个高效策略:快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…