首页 游戏 软件 资讯 排行榜 专题
首页
编程语言
怎么在 Java 中使用 Logger 记录不同级别的系统运行日志

怎么在 Java 中使用 Logger 记录不同级别的系统运行日志

热心网友
46
转载
2026-05-03

怎么在 Ja va 中使用 Logger 记录不同级别的系统运行日志

怎么在 Ja va 中使用 Logger 记录不同级别的系统运行日志

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

先明确一个核心概念:Ja va自带的日志系统,其默认行为和我们直观的预期可能不太一样。比如,下面这段描述就点出了一个关键细节:

Ja va Logger默认只输出INFO及以上级别,FINE及更低级别需同时设置Logger和Handler(如ConsoleHandler)的level为ALL才能输出;SEVERE到FINEST共7级,按严重性降序排列,OFF关闭日志、ALL启用全部。

理解了这个前提,我们再来深入聊聊具体怎么用。

Ja va 中 Logger 的基础配置和级别对应关系

很多开发者初次接触ja va.util.logging.Logger时都会遇到一个困惑:明明调用了logger.fine(),为什么控制台一片寂静?这其实不是代码写错了,而是设计如此。JUL的Logger默认只输出INFO及以上级别(包括WARNINGSEVERE),而FINEFINERFINEST这些调试级别的日志,在默认配置下直接被过滤掉了。

这里最常见的“坑”就是只设置了Logger的级别,却忘了处理它的Handler。光调用logger.setLevel(Level.FINE)是没用的,必须让负责实际输出的ConsoleHandler也“放行”才行。

那么,这几个级别到底该怎么用?简单来说,可以这样对应:

  • SEVERE:最高级别,用于记录导致应用功能严重受损或即将终止的错误,比如空指针异常中断了核心业务流程。
  • WARNING:潜在的问题,但程序还能继续运行。例如,某个配置项缺失,系统自动使用了默认值。
  • INFO:记录关键的业务节点信息,比如“用户支付成功”、“订单已创建”、“缓存数据已刷新”。这是生产环境最常关注的级别。
  • FINE:常规的调试信息,适合记录方法入参、SQL执行前的完整语句等。
  • FINER:更细粒度的追踪,比如在循环体内记录每次迭代的中间状态。
  • FINEST:最高频、最琐碎的细节,例如记录网络请求中每一个Header的收发情况,通常只在深度排查问题时开启。

如何让 FINE 级日志真正打印到控制台

想让那些调试日志现身,关键在于“双管齐下”:既要配置Logger本身允许该级别通过,也要确保处理日志的Handler(比如ConsoleHandler)不会在半路把它拦截掉。

来看一段标准的配置代码:

Logger logger = Logger.getLogger(“MyApp”);
logger.setLevel(Level.ALL); // 第一步:Logger允许所有级别通过
ConsoleHandler handler = new ConsoleHandler();
handler.setLevel(Level.ALL); // 第二步(关键):Handler也要放开限制
handler.setFormatter(new SimpleFormatter()); // 可选,避免默认的XML格式影响阅读
logger.addHandler(handler);

另外有个环境小贴士:如果你在IDE(比如IntelliJ IDEA)里以JUnit模式运行测试,有时会发现控制台看不到日志。这是因为测试环境可能重定向了System.out,导致ConsoleHandler的输出“消失”了。遇到这种情况,临时改用FileHandler输出到文件,或者考虑迁移到SLF4J + Logback这类更现代的日志框架,往往是更省心的选择。

立即学习“Ja va免费学习笔记(深入)”;

log.info() 和 log.log(Level.INFO, ...) 的区别

表面上看,log.info(“msg”)log.log(Level.INFO, “msg”)效果一样,但底层逻辑有细微差别,而这些差别直接影响着性能和排查问题的便利性。

  • 性能优化:使用log.info(“User {0} logged in”, userId)这种带占位符的写法时,如果INFO级别的日志当前被禁用,那么userId.toString()这个方法根本不会执行。这避免了无谓的字符串拼接和对象转换,对性能友好。
  • 异常堆栈log.log(Level.WARNING, “DB timeout”, ex)这个方法会自动将异常ex的完整堆栈跟踪信息附加到日志末尾。而如果用log.warning(“DB timeout: ” + ex),打印出来的通常只是异常的toString()信息,宝贵的堆栈细节就丢失了。
  • 一个常见的反模式:要避免混用风格,比如写成log.info(“id=” + id + “, name=” + name)。这种字符串拼接无论日志级别是否开启都会立即执行,白白消耗CPU资源。

生产环境为什么不该直接用 JUL(ja va.util.logging)

尽管JUL是Ja va标准库的一部分,但在现代生产环境中直接使用它,往往会遇到一些设计上的局限。

首要问题是Handler的全局性。默认的ConsoleHandlerFileHandler几乎是单例模式,如果在多个Logger实例上调用addHandler(),很容易导致同一条日志被重复输出多次。

其次是配置不够灵活。JUL主要依赖logging.properties文件或硬编码来配置,很难实现像“针对某个特定的包或类动态调整日志级别”这样的精细操作。

因此,真实项目里更常见的做法是采用桥接或替代方案:

  • 对于需要兼容旧系统的场景,可以引入slf4j-jdk14模块,将SLF4J的API调用桥接到JUL的实现上。
  • 更主流、更推荐的方式是直接使用slf4j-api作为门面,搭配logback-classic作为实现。通过logback.xml配置文件,可以轻松管理不同包的日志级别、定义丰富的输出格式、设置日志文件的滚动切割策略。
  • Spring Boot默认就集成了Logback,你只需要在application.properties里写一句logging.level.com.example.service=DEBUG,配置即刻生效,体验比JUL的properties文件直观得多。

当然,如果你正在维护一个历史包袱很重、无法引入新依赖的老系统,那么JUL依然是可用的。只是需要格外小心前面提到的Handler复用和级别穿透问题,尤其是在多模块共享同一个Logger名称时,这个问题特别容易暴露出来。

来源:https://www.php.cn/faq/2411158.html
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关攻略

Sublime配置跨平台Java开发环境_联动Maven构建与热部署调试工具
编程语言
Sublime配置跨平台Java开发环境_联动Maven构建与热部署调试工具

Sublime Text 能不能当主力 Ja va IDE? 答案很明确:不能。但它完全可以胜任一个高效的“轻量级开发终端”。关键在于认清它的能力边界——Sublime Text 本身并不具备 Ja va 语法解析、类路径管理、Ma ven 生命周期控制,或是连接 JVM 调试协议(JDWP)的能力

热心网友
05.02
使用位运算优化多条件状态报告的Java实现方法
编程语言
使用位运算优化多条件状态报告的Java实现方法

基于位运算的容差检测报告优化方案 在工业级数据校验场景中,比如木材尺寸的容差检测,我们常常需要根据多个布尔状态(如厚度、宽度、长度是否合格)来组合生成差异化的提示信息。传统的实现方式,往往是写下一长串的 if-else 分支,来覆盖所有可能的逻辑组合。功能虽然能实现,但问题也很明显:代码重复度高,扩

热心网友
05.01
如何在 Java 中使用 ArrayList.ensureCapacity() 减少由于频繁增删导致的数组重分配
编程语言
如何在 Java 中使用 ArrayList.ensureCapacity() 减少由于频繁增删导致的数组重分配

如何在 Ja va 中使用 ArrayList ensureCapacity() 减少由于频繁增删导致的数组重分配 ensureCapacity() 真的能减少重分配吗? 答案是肯定的,但这里有个关键前提:它只对“新增”操作有效,而且必须在执行大量 add() 之前就调用。至于 remove() 操

热心网友
05.01
如何在 Java 中利用 while 循环实现一个简单的基于时间轮算法的定时任务调度流程
编程语言
如何在 Java 中利用 while 循环实现一个简单的基于时间轮算法的定时任务调度流程

如何在 Ja va 中利用 while 循环实现一个简单的基于时间轮算法的定时任务调度流程 可行但仅适用于学习、嵌入式或教学场景;生产环境应优先选用 HashedWheelTimer、ScheduledThreadPoolExecutor 或 Quartz。 在 Ja va 中,用 while

热心网友
05.01
如何在 Java 中使用 String.matches() 编写带有“零宽断言”的高级正则校验表达式
编程语言
如何在 Java 中使用 String.matches() 编写带有“零宽断言”的高级正则校验表达式

如何在 Ja va 中使用 String matches() 编写带有“零宽断言”的高级正则校验表达式 说起 Ja va 里的 String matches() 方法,很多开发者都踩过同一个坑:它要求正则表达式必须从头到尾、完完整整地匹配整个字符串。这相当于在模式前后自动加上了 ^ 和 $。所以,当

热心网友
05.01

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

企业介绍信范文怎么写精选5篇
礼仪与书信
企业介绍信范文怎么写精选5篇

企业介绍信写作指南:掌握这份正式商务“名片”的核心要素与实用范文 在商业合作与行政事务中,企业介绍信是一份至关重要的正式文书。它不仅是身份与意图的权威证明,更是建立信任、开启合作的“通行证”。一份撰写规范、信息完备的介绍信,能有效提升沟通效率,保障业务顺畅推进。本文将深入解析企业介绍信的写作要点,并

热心网友
05.03
学校实习介绍信模板大全
礼仪与书信
学校实习介绍信模板大全

学校实习介绍信模板大全 在现代职场与高校人才培养体系中,实习介绍信已成为连接校园与社会的重要桥梁。作为一份具有正式效力的官方推荐文书,它不仅为学生开启实践之门,也为用人单位提供了可靠的背景参考。为帮助广大师生高效处理实习事务,我们精心整理并优化了以下几款高实用性的学校实习介绍信标准模板,供您直接套用

热心网友
05.03
2026年新生入学自我介绍
礼仪与书信
2026年新生入学自我介绍

每到新环境,一份得体的自我介绍往往是开启人际交往的第一扇门。下面这份“2026年新生入学自我介绍”灵感合集,旨在为即将步入新阶段的你提供实用参考与创意启发。 2026年新生入学自我介绍【一】 尊敬的老师,亲爱的同学们: 大家好。关于“懂事”这个词,我记忆中最深刻的一次体验,发生在我四岁那年。 那时,

热心网友
05.03
BLUR币有什么发展前景?是否适合新手投资
web3.0
BLUR币有什么发展前景?是否适合新手投资

近期,BLUR币因其在NFT市场的活跃表现备受关注 最近,NFT交易平台币BLUR在圈内的讨论度明显升温。它本质上是一个专注于NFT交易和社区生态的平台代币,核心目标很明确:提升NFT市场的交易效率和用户体验,同时通过一套精心设计的激励机制,把更多的玩家和收藏家吸引到这个生态里来。 对于刚接触这个领

热心网友
05.03
新生的自我介绍2026年
礼仪与书信
新生的自我介绍2026年

2026级大学新生自我介绍范文【一】 大家好,我是来自XX高中的XX。如果学科也有性格,我想我与文学最为投契。相较于理科世界中严谨的公式与抽象的几何,文学世界里流淌的人文气息与思想深度,总能更深地触动我的内心。在独处的时光里,与一本好书为伴是最惬意的事。沉浸于经典著作所构建的广阔世界,品味字里行间浓

热心网友
05.03