下面我将从 通用命令、Linux 系统日志、应用服务日志 三个层面,为你详细梳理最常用和最强大的查询日志命令。

通用命令 (适用于几乎所有文本日志文件)
这些是基础中的基础,必须熟练掌握。
cat - 查看文件全部内容
# 查看整个日志文件,适合小文件 cat /var/log/syslog
缺点:对于大文件,屏幕会飞速滚动,内容一闪而过,不便于查看。
less - 分页查看文件内容 (推荐)
less 是一个强大的分页查看器,非常适合查看大文件。
# 打开文件,可以用方向键或 j/k 上下移动,PageUp/PageDown 翻页 less /var/log/syslog # 在 less 中常用的操作: # /keyword - 向下搜索 "keyword" # ?keyword - 向上搜索 "keyword" # n - 跳到下一个搜索结果 # N - 跳到上一个搜索结果 # q - 退出 less
head - 查看文件开头
默认显示文件前 10 行。

# 查看文件前 10 行 head /var/log/syslog # 查看文件前 100 行 head -n 100 /var/log/syslog
tail - 查看文件结尾 (实时监控利器)
默认显示文件最后 10 行,是排查问题的常用命令。
# 查看文件最后 10 行 tail /var/log/syslog # 查看文件最后 100 行 tail -n 100 /var/log/syslog # 实时监控日志文件的更新,Ctrl+C 退出 tail -f /var/log/syslog # 从第 100 行开始实时监控 tail -n +100 -f /var/log/syslog
grep - 文本搜索过滤
grep 是最强大的文本搜索工具,通常与其他命令结合使用。
# 在文件中搜索包含 "error" 的所有行 grep "error" /var/log/syslog # 搜索不区分大小写 grep -i "error" /var/log/syslog # 显示匹配行的行号 grep -n "error" /var/log/syslog # 搜索不包含 "info" 的行 grep -v "info" /var/log/syslog # 统计 "error" 出现的次数 grep -c "error" /var/log/syslog
组合使用示例 (非常重要!):
# 实时监控日志,并只显示包含 "error" 的行 tail -f /var/log/syslog | grep "error" # 查看日志文件最后 500 行,并搜索包含 "failed" 的行 tail -n 500 /var/log/auth.log | grep "failed"
wc - 统计行数、字数、字节数
# 统计文件的行数(常用来快速了解日志大小) wc -l /var/log/syslog # 结合 grep 使用,统计匹配的行数 grep -c "error" /var/log/syslog # 等同于 grep "error" /var/log/syslog | wc -l
Linux 系统日志查询
现代 Linux 发行版(如 Ubuntu 18.04+, CentOS 7+)普遍使用 systemd 的日志系统 journald。

使用 journalctl (Systemd 日志)
journalctl 是查询和操作 systemd 日志的瑞士军刀。
# 查看所有日志 (内核 + systemd + 服务) journalctl # 查看内核日志 journalctl -k # 查看系统启动后的所有日志 journalctl -b # 查看本次启动的日志 journalctl -b -0 # 查看上次启动的日志 journalctl -b -1 # 实时监控所有日志 journalctl -f # 只显示特定服务的日志 (nginx) journalctl -u nginx.service # 查看 nginx 服务最近的 100 条日志 journalctl -u nginx.service --since "10 min ago" -n 100 # 按时间范围查询 journalctl --since "2025-10-27 10:00:00" --until "2025-10-27 11:00:00" # 查看特定 PID 的日志 journalctl _PID=1234 # 查看特定用户的日志 (例如用户 "www") journalctl _UID=33 # 只显示错误级别的日志 (-p 优先级) # emerg, alert, crit, err, warning, notice, info, debug journalctl -p err # 查看系统进入的状态 (例如启动、关机) journalctl -p err -b | grep "systemd" # 输出格式化,显示可读性强的元数据 journalctl -o verbose | grep "error"
查看传统日志文件 (位于 /var/log/)
即使使用了 systemd,很多应用仍然会写入传统的日志文件。
| 日志文件名 | 描述 |
|---|---|
/var/log/syslog |
Linux 系统日志,记录系统事件和守护进程信息。 |
/var/log/messages |
系统的主要日志文件,记录核心系统信息。 (RHEL/CentOS) |
/var/log/kern.log |
内核日志。 |
/var/log/auth.log |
认证、登录相关日志。 (Debian/Ubuntu) |
/var/log/secure |
认证、登录相关日志。 (RHEL/CentOS) |
/var/log/cron.log |
计划任务 cron 的日志。 |
/var/log/dmesg |
系统启动时内核的环缓冲区信息。 |
/var/log/Xorg.log |
X Window 图形系统日志。 |
应用服务日志查询
不同的应用服务有其特定的日志位置和查询方式。
Web 服务器
-
Nginx:
-
默认位置:
/var/log/nginx/ -
access.log: 记录所有访问请求。 -
error.log: 记录 Nginx 服务错误。 -
查询示例:
# 查看 Nginx 错误日志最后 50 行 tail -n 50 /var/log/nginx/error.log # 实时监控 Nginx 访问日志中 404 错误 tail -f /var/log/nginx/access.log | grep ' 404 '
-
-
Apache (httpd):
- 默认位置:
/var/log/httpd/(RHEL/CentOS) 或/var/log/apache2/(Debian/Ubuntu) access_log: 记录所有访问请求。error_log: 记录 Apache 服务错误。- 查询示例:
# 查看 Apache 错误日志 tail -f /var/log/httpd/error_log
- 默认位置:
数据库
-
MySQL / MariaDB:
-
默认位置:
/var/log/mysql/或/var/log/mariadb/ -
error.log: 记录数据库启动、运行和错误信息。 -
查询示例:
# 查看MySQL错误日志 tail -f /var/log/mysql/error.log
-
也可以使用
mysql客户端内置的查询命令:-- 查询错误日志 SHOW GLOBAL VARIABLES LIKE 'log_error'; -- 查询慢查询日志 SHOW VARIABLES LIKE '%slow_query%';
-
-
PostgreSQL:
- 默认位置:
/var/log/postgresql/ postgresql-<version>.log: 数据库服务器日志。- 查询示例:
# 查看PostgreSQL日志 tail -f /var/log/postgresql/postgresql-15-main.log
- 默认位置:
容器与 Docker
-
Docker:
-
查看容器日志是
docker logs命令。 -
查询示例:
# 查看名为 "my_container" 的容器的所有日志 docker logs my_container # 实时查看容器的日志 docker logs -f my_container # 查看容器最后 100 行日志 docker logs --tail 100 my_container # 查看容器最近 5 分钟的日志 docker logs --since 5m my_container
-
高级日志查询工具
当需要同时搜索多个日志文件或在大量日志中进行复杂分析时,可以使用专业工具。
awk - 强大的文本分析工具
awk 可以按列处理文本,非常适合结构化日志。
# 假设 Nginx 日志格式为 IP - - [time] "request" "status" "size"
# 统计访问次数最多的 IP 地址
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr
# 解释: {print $1} 打印第一列(IP) | sort 排序 | uniq -c 合并相同行并计数 | sort -nr 按数字降序排列
sed - 流编辑器
sed 用于对文本进行替换、删除、插入等编辑操作。
# 将日志文件中的 "old_ip" 替换为 "new_ip" (注意:这会修改原文件,建议先 cp 备份) sed -i 's/old_ip/new_ip/g' /var/log/myapp.log # 只查看包含 "error" 的行,并删除其中的 "debug:" 字符串 grep "error" /var/log/myapp.log | sed 's/debug: //'
ELK Stack / EFK Stack (企业级日志分析)
对于大型系统,通常会使用专业的日志收集和分析平台。
- Elasticsearch: 分布式搜索引擎,用于存储和索引日志。
- Logstash / Fluentd: 日志收集、转换和传输的“数据管道”。
- Kibana: 基于 Elasticsearch 的数据可视化平台,提供强大的图表和仪表盘。
总结与最佳实践
- 先定位日志: 确定你要查的日志是系统日志、应用日志还是容器日志,找到正确的文件路径。
- 从
tail -f开始: 对于正在发生的问题,tail -f是你的第一个朋友。 - 用
grep过滤: 不要试图一次性看完所有日志,用grep精准定位到关键词。 - 善用
less和journalctl: 对于离线日志和系统日志,这两个工具提供了最全面的浏览和搜索能力。 - 组合是王道:
tail+grep,cat+grep,journalctl+grep等组合使用,可以解决绝大多数问题。 - 定期清理: 日志文件会越来越大,配置日志轮转(logrotate)策略,避免磁盘被占满。
