日志是系统运行的详细记录,当服务器出现性能异常或服务中断时,高效的日志排查能力是快速定位问题的关键。面对分散且格式多样的日志文件,掌握正确的工具和方法能极大提升系统运维的效率。本文将系统介绍传统的命令行工具与现代的journalctl,助你构建清晰的日志排查思路。
二、日志查看命令大全
下表汇总了Linux环境下核心的日志查看命令及其适用场景:
| 命令 |
主要功能 |
典型使用场景 |
关键参数 |
tail -f |
实时监控日志更新 |
服务部署后观察启动情况 |
-f(实时)、-n(行数) |
grep |
关键词过滤 |
查找特定错误信息 |
-i(忽略大小写)、-C(上下文) |
less |
分页查看日志 |
分析历史日志文件 |
/(搜索)、Shift+g(跳转末尾) |
journalctl -f |
实时监控系统日志 |
系统级故障实时监控 |
-f(实时跟踪) |
journalctl -u |
查看特定服务日志 |
服务故障排查 |
-u(指定服务单元) |
journalctl --since |
按时间范围查询 |
定位特定时间段的问题 |
--since、--until |
journalctl -p |
按优先级过滤 |
快速定位错误和警告 |
-p(优先级级别) |
三、传统日志查看工具:基础但不可替代
尽管现代Linux发行版普遍采用systemd,但tail、grep、less等传统命令仍是处理文本日志文件的基石,熟练掌握它们至关重要。
1. tail命令:实时监控的“监视器”
tail命令能够实时输出文件末尾的新增内容,是观察日志动态的利器。
# 实时查看日志更新
tail -f /var/log/nginx/access.log
# 查看最后100行并持续监控
tail -n 100 -f /var/log/system.log
# 同时监控多个日志文件
tail -f /var/log/nginx/access.log -f /var/log/nginx/error.log
应用场景:部署新服务后,使用tail -f实时跟踪启动日志,即时发现报错。
2. grep命令:日志中的“搜索引擎”
grep用于在文件中搜索匹配指定模式的行,能从海量日志中快速提取关键信息。
# 查找包含“error”的行
grep “error” /var/log/system.log
# 忽略大小写搜索“timeout”
grep -i “timeout” /var/log/application.log
# 显示匹配行及其后10行内容
grep -A 10 “NullPointerException” /var/log/app.log
# 搜索“ERROR”或“WARN”
grep -e “ERROR” -e “WARN” /var/log/system.log
应用场景:用户反馈接口超时,使用grep -i "timeout"快速过滤相关请求日志。
3. less命令:大型日志文件的“导航器”
对于庞大的日志文件,less支持分页浏览和交互式搜索,便于深入分析。
# 打开日志文件
less /var/log/large-logfile.log
# 在less中常用的导航命令:
# /keyword - 向前搜索关键词
# ?keyword - 向后搜索关键词
# n - 下一个匹配项
# N - 上一个匹配项
# Shift+g - 跳转到文件末尾
# g - 跳转到文件开头
应用场景:分析前一日日志时,用less打开后按Shift+g跳至末尾,再用?向上回溯搜索错误。
四、journalctl:现代Linux的日志利器
journalctl是systemd系统自带的日志管理工具,它统一管理内核、系统及服务的日志,提供强大的查询和过滤功能,是现代Linux故障排查的核心工具。
1. 基础查询:掌握日志排查的“三板斧”
# 查看全部日志(信息量大,慎用)
journalctl
# 查看本次启动后的日志
journalctl -b
# 实时跟踪日志输出
journalctl -f
应用场景:系统出现异常时,开启一个终端执行journalctl -f实时监控全局日志。
2. 精准过滤:像侦探一样缩小嫌疑范围
高效的故障排查依赖于精准的日志过滤。
# 按服务单元过滤
journalctl -u nginx.service
# 按时间范围过滤
journalctl --since “2025-01-20 09:00:00” --until “2025-01-20 10:00:00”
journalctl --since “1 hour ago”
# 按优先级过滤(err及以上)
journalctl -p err -b
应用场景:监控显示9-10点系统负载飙升,可快速过滤该时段错误日志:
journalctl --since “09:00” --until “10:00” -p err..warning
3. 高级技巧:深度排查的“秘密武器”
# 查看指定进程ID的日志
journalctl _PID=1234
# 以JSON格式输出(便于脚本解析)
journalctl -u nginx.service -o json-pretty
# 查看内核日志
journalctl -k
# 显示日志占用的磁盘空间
journalctl --disk-usage
# 清理7天前的旧日志
journalctl --vacuum-time=7d
应用场景:某个进程异常崩溃,使用_PID=参数查看其完整的生命周期日志记录。
五、实战案例:从报警到恢复的完整流程
通过一个模拟案例,串联使用上述命令解决问题。
案例:数据库连接池耗尽
场景:凌晨收到数据库连接池耗尽的报警。
第一步:快速确认问题
# 实时查看最近5分钟应用日志
journalctl -u application.service -f --since “5 minutes ago”
观察到大量“Could not obtain database connection”错误,确认连接池耗尽。
第二步:定位根本原因
# 检索过去10分钟内与数据库相关的日志
journalctl -u application.service --since “10 minutes ago” | grep -i “database”
发现一条执行超过30秒的慢查询SQL,正是它长期占用连接导致池耗尽。
第三步:解决并验证
优化问题SQL后,持续监控恢复状态:
tail -f /var/log/application.log | grep “connection”
观察到可用连接数逐渐回升,问题得以解决。
六、日志管理最佳实践
- 定期轮转日志:配置
logrotate工具,防止单个日志文件过大。
- 关键日志备份:将重要日志同步至远程存储或日志平台,避免本地丢失。
- 建立监控告警:对日志中的关键错误模式(如
ERROR、FATAL)配置实时告警。
- 合理配置日志级别:生产环境避免使用
DEBUG级别,以防日志量剧增影响性能。
七、总结
掌握Linux日志排查命令是后端工程师和运维人员的必备技能。传统文本工具(tail, grep, less)与现代系统化工具(journalctl)相辅相成,应根据实际场景灵活选用。高效的故障排查更依赖于清晰的方法论:从整体监控切入,利用过滤条件逐步缩小范围,最终定位问题根因。
参考资料
- https://blog.csdn.net/gitblog_01128/article/details/151604666
- https://m.php.cn/faq/1388465.html
- https://m.jb51.net/server/335812xmz.htm
- https://www.cnblogs.com/huangjiabobk/p/18731994
- https://worktile.com/kb/ask/368776.html
- https://blog.csdn.net/gitblog_00652/article/details/152380322
- https://blog.csdn.net/gao_gavin_fei/article/details/153004003