告别System.out.println!Log4j日志框架通关秘籍,从入门到封神 🚀
前言:还在靠System.out.println打日志排错?线上环境日志刷屏找不到关键信息?日志文件大到爆盘?今天这篇文,带你把Log4j玩出花,从“日志小白”秒变“日志大神”,让日志成为你排查问题的神队友!
一、先吐槽:为啥System.out.println是“日志刺客”?
咱先聊聊踩坑经历:刚入行时,我满屏写System.out.println("用户登录了"),测试环境看着挺香,一到生产环境直接“翻车”——
-
日志全堆控制台,运维小哥追着我骂:“控制台卡爆了!”
-
想查昨天的异常?没备份,日志早没了😥
-
调试信息和报错信息混在一起,翻半天找不到关键内容
直到我用上了Log4j,才发现:原来日志还能这么玩!多输出目的地、自动分割文件、按级别过滤… 简直是打开了新世界的大门。
二、日志框架界的“老大哥”:Log4j凭啥这么香?
先看一组灵魂对比,懂的都懂:
|
性能 |
同步阻塞,高并发直接卡成PPT |
异步输出,高并发也能丝滑运行 |
|
目的地 |
只有控制台,想存文件?自己写代码 |
控制台、文件、数据库、消息队列… 想输哪就输哪 |
|
格式 |
光秃秃的文字,连时间都没有 |
自带时间、线程、类名、行号,结构化一目了然 |
|
持久化 |
手动备份?不存在的 |
按大小/时间自动分割,归档贼省心 |
|
级别控制 |
所有日志全输出,想关都关不掉 |
想输啥级别输啥级别,生产环境一键屏蔽调试日志 |
三、Log4j核心三剑客:Logger、Appender、Layout 🤺
Log4j的核心就仨组件,拟人化理解超简单:
3.1 Logger(日志记录员)
相当于公司里“收集信息的前台”,程序里直接调用它记录日志。
-
命名技巧:用当前类的全限定名(比如com.demo.UserService),日志出问题能精准定位到类!
-
获取方式:Logger logger = Logger.getLogger(当前类.class);(后面有偷懒技巧,不用每次写)
3.2 Appender(日志快递员)
负责把日志“送”到指定地方,一个记录员可以对接多个快递员:
-
🖥️ ConsoleAppender:送控制台(测试用)
-
📄 FileAppender:送普通文件
-
🔄 RollingFileAppender:文件满了自动分割(生产必用!)
-
📅 DailyRollingFileAppender:每天生成一个日志文件(查历史日志超方便)
3.3 Layout(日志包装员)
给日志“包装”成好看又实用的格式,比如带时间、级别、类名:
-
最常用的PatternLayout:自定义模板,比如%d{yyyy-MM-dd HH:mm:ss} [%5p] %c{1} – %m%n,输出效果:
2024-05-20 16:30:00 [ INFO] UserService – 用户admin登录成功
四、日志级别:别瞎打!不同场景用对级别 🚨
Log4j的日志级别有优先级(从高到低),记好这个口诀:FATAL躺平,ERROR报错,WARN提醒,INFO日常,DEBUG调试,TRACE刨根
|
FATAL |
程序直接躺平,没法跑了(致命错误) |
数据库连接失败、核心配置丢了 |
|
ERROR |
出问题了,但程序还能凑活用 |
单个接口调用失败、数据查询报错 |
|
WARN |
不太对,但不一定报错(温馨提示) |
参数不合法、缓存过期、用户密码复杂度太低 |
|
INFO |
正常运行的关键节点(留痕用) |
程序启动完成、用户登录成功、订单提交完成 |
|
DEBUG |
开发调试用(生产环境要关) |
变量值、方法执行步骤、接口入参 |
|
TRACE |
比DEBUG还细(几乎不用) |
代码每一步执行轨迹(比如循环里的每一次迭代) |
💡 核心规则:只输出 ≥ 当前级别日志!比如设为INFO,DEBUG/TRACE直接被过滤,生产环境超省空间。
五、环境搭建:5分钟搞定Log4j 🛠️
5.1 Maven一键引入(懒人版)

5.2 无配置文件?Log4j的“默认脾气”
没配配置文件时,Log4j只输出ERROR/FATAL级别到控制台,别踩坑!

运行结果:只有ERROR日志会出来,DEBUG直接被吞!
六、配置文件玩出花:Properties vs XML 📝
Log4j支持两种配置方式,小白选Properties,大佬选XML,咱都讲!
6.1 Properties(小白友好款)
键值对格式,简单粗暴,举个生产常用的例子:

6.2 XML(高端定制款)
结构清晰,适合复杂配置,比如给不同包配不同级别:

6.3 小技巧:按包配置日志级别
比如让com.demo.service包只输出INFO,其他包输出DEBUG,生产超实用!

七、偷懒神器:SLF4J + Lombok@Slf4j ✨
还在写Logger logger = Logger.getLogger(XXX.class)?太out了!用@Slf4j注解,一行都不用写!
7.1 引入依赖

7.2 代码直接起飞

💡 注意:IDEA/Eclipse要装Lombok插件,不然会提示log找不到(编译不影响,只是提示)。
八、踩坑指南:那些年我们踩过的Log4j坑 🕳️
坑1:警告“Could not find log4j.properties”
原因:配置文件没放对位置!
解决:把log4j.properties/xml放到src/main/resources(Maven项目)。
坑2:日志写不进文件
排查步骤:
路径错了?检查File配置(绝对路径/相对路径);
没权限?给日志目录加写入权限;
级别太高?比如设了INFO,DEBUG日志写不进去。
坑3:日志重复输出
原因:自定义Logger的additivity默认true,继承了根Logger的Appender。
解决:log4j.additivity.包名=false,禁止继承!
九、实战总结:Log4j最佳实践 📖
生产环境别开DEBUG/TRACE:日志太多,磁盘扛不住;
用占位符代替字符串拼接:log.info("用户{}", name) 比 log.info("用户" + name) 性能好;
敏感信息别打日志:密码、手机号、身份证号要脱敏;
用滚动日志:RollingFileAppender/DailyRollingFileAppender,避免文件过大;
按包/类配置级别:不同模块日志按需输出,排查更高效。
最后:从“日志小白”到“日志大神”
Log4j不是花里胡哨的技术,而是能实实在在提高排错效率的工具。告别System.out.println,用Log4j把日志玩明白,线上问题排查效率直接翻倍!
如果这篇文章帮到你,记得点赞+收藏🌟,有问题评论区交流,咱们一起把日志玩出花~
网硕互联帮助中心


评论前必须登录!
注册