菜鸟科技网

查询日志命令有哪些?

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

查询日志命令有哪些?-图1
(图片来源网络,侵删)

通用命令 (适用于几乎所有文本日志文件)

这些是基础中的基础,必须熟练掌握。

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 行。

查询日志命令有哪些?-图2
(图片来源网络,侵删)
# 查看文件前 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

查询日志命令有哪些?-图3
(图片来源网络,侵删)

使用 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 的数据可视化平台,提供强大的图表和仪表盘。

总结与最佳实践

  1. 先定位日志: 确定你要查的日志是系统日志、应用日志还是容器日志,找到正确的文件路径。
  2. tail -f 开始: 对于正在发生的问题,tail -f 是你的第一个朋友。
  3. grep 过滤: 不要试图一次性看完所有日志,用 grep 精准定位到关键词。
  4. 善用 lessjournalctl: 对于离线日志和系统日志,这两个工具提供了最全面的浏览和搜索能力。
  5. 组合是王道: tail + grepcat + grepjournalctl + grep 等组合使用,可以解决绝大多数问题。
  6. 定期清理: 日志文件会越来越大,配置日志轮转(logrotate)策略,避免磁盘被占满。
分享:
扫描分享到社交APP
上一篇
下一篇