在 Linux 环境下排查 Java 应用程序的日志,这项任务看似简单,但若缺乏有效方法,很容易让人陷入困境。日志文件动辄数百兆甚至数 GB,仅靠肉眼逐行搜索,效率极低。换个思路,善用 Linux 自带的那几款经典工具,绝大多数分析场景都能轻松应对。

先介绍最基础也最常用的——grep。它能帮助你在日志中快速定位关键词,例如想要找出所有包含 ERROR 的行,一条命令即可搞定:
grep 'ERROR' /path/to/your/logfile.log
看起来简单,但实际使用时可以搭配 -i 忽略大小写、-v 排除某些行、-c 统计出现次数,组合起来非常灵活。比如想知道今天发生了多少次 OutOfMemoryError,加上 grep -c 'OutOfMemoryError' 就能立刻得到结果。
如果需要对日志进行更复杂的处理,awk 是真正的利器。它能按字段分割、做条件判断,甚至进行累加统计。举个例子,想统计某个时间段内 ERROR 出现的总次数,可以这样写:
awk '/[[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}] .* ERROR/ {count++} END {print count}' /path/to/your/logfile.log
这个模式匹配了标准的时间戳格式,后面跟着 ERROR 关键字,然后将符合条件的行数累加起来。实际使用时可以根据你的日志格式调整正则表达式,效果立竿见影。
再来说 sed,它擅长文本替换、行删除、范围提取。比如你只关心某两个时间点之间的日志,sed 可以帮你精确截取:
sed -n '/[[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}/,/[[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}/p' /path/to/your/logfile.log
这里用到了 sed 的地址范围功能,从第一个时间戳行开始打印,直到第二个时间戳行结束。如果日志结构比较规整,这个办法比手动翻页快捷得多。
当然,除了命令行三件套,成熟的日志分析平台也能大幅提升效率。像 ELK(Elasticsearch、Logstash、Kibana)、Splunk、Grafana 这类工具,提供了搜索、过滤、可视化、告警一整套能力。如果你的日志量已经大到单机处理不过来,或者需要跨多个服务器检索,迁移到这套体系是迟早的事。不过在小团队或临时排查场景下,先熟练使用命令行工具更加实际。
最后,别忘了利用 Java 日志框架本身的功能。无论是 Log4j、Logback 还是 SLF4J,它们都内置了日志级别过滤、文件滚动、归档等机制。比如把 ERROR 级别的日志单独输出到一个文件,或者按天生成滚动日志,这些配置在初期就规划好,后续分析会节省很多力气。所谓“工欲善其事,必先利其器”,把日志框架的配置调优到位,往往能减少不少排查工作量。
说到底,在 Linux 上分析 Java 日志,方法不是越复杂越好,而是要看场景、看数据量、看团队习惯。从命令行到平台化,循序渐进就好。关键是用起来顺手,能快速定位到问题根因。
