在Linux服务器上排查项目问题,查看日志是最直接、最高效的手段。本教程将从基础到进阶,全面介绍在Linux环境中查看、分析和监控项目日志的各种方法。

一、 定位日志文件

首先,你需要知道日志文件在哪里。项目日志的位置通常由项目配置决定。

常见日志目录

  • 项目部署目录:很多项目会将日志文件生成在自身的应用目录下,例如 ./logs/
  • 系统应用日志目录/var/log/ 是Linux系统存放日志的标准位置。
    •  系统日志:/var/log/syslog (Ubuntu/Debian) 或 /var/log/messages (CentOS/RHEL)。
    •  认证日志:/var/log/auth.log (Ubuntu/Debian) 或 /var/log/secure (CentOS/RHEL)。
    •  Web服务器日志:Nginx日志通常在 /var/log/nginx/,Apache日志在 /var/log/apache2/ 或 /var/log/httpd/
  •   数据库日志:MySQL日志默认在 /var/log/mysql/
  • 用户目录:少数应用可能会在用户主目录下生成日志,如 ~/.java/

使用命令定位

如果不确定日志位置,可以使用 find 命令进行查找。

# 在当前目录及其子目录中查找所有 .log 文件
find . -name "*.log"

# 在整个系统中查找名为 "app.log" 的文件 (可能需要sudo权限)
sudo find / -name "app.log"
二、 核心查看命令

定位到日志文件后,可以使用以下核心命令进行查看。

1. cat:一次性查看全部内容

cat 命令会将整个文件内容输出到终端。它适合查看体积较小的日志文件。对于大文件,输出会刷屏,难以阅读。

cat /path/to/your/app.log

2. less / more:分页浏览大文件

当日志文件非常大时,less 是最佳选择。它允许你逐页滚动,并支持搜索。

  • 基本用法less /path/to/your/app.log
  • 常用快捷键
    • 空格键 或 Page Down:向下翻页。
    •  b 或 Page Up:向上翻页。
    •  /关键词:向下搜索关键词,例如 /error
    •  n:跳转到下一个匹配项。
    •  N:跳转到上一个匹配项。
    •  q:退出 less

more 命令功能类似,但只能向下翻页,功能不如 less 强大。

3. head / tail:查看文件首尾

这两个命令用于查看文件的开头或结尾部分。

head:查看文件开头。默认显示前10行。

# 查看前20行
head -n 20 /path/to/your/app.log

tail:查看文件结尾。默认显示后10行。这是查看最新日志最常用的命令。

# 查看最后50行
tail -n 50 /path/to/your/app.log
    

4. tail -f:实时监控日志

这是排查线上问题时的“神器”。-f (follow) 参数会让 tail 命令持续监控文件,一旦有新的日志写入,就会立即显示在终端上。

# 实时监控日志文件的最新内容
tail -f /path/to/your/app.log

按 Ctrl+C 可以退出实时监控模式。

三、 高级筛选与组合命令

单纯的查看可能不够,我们常常需要筛选出关键信息。

1. grep:强大的文本搜索工具

grep 命令可以从日志文件中筛选出包含特定关键词的行。

基本搜索:查找包含 "error" 的行。

grep "error" /path/to/your/app.log

忽略大小写:使用 -i 参数。

grep -i "error" /path/to/your/app.log    

排除匹配:使用 -v 参数,例如排除所有 "INFO" 级别的日志。  

grep -v "INFO" /path/to/your/app.log

显示上下文:使用 -A (After) 和 -B (Before) 显示匹配行及其前后N行,便于了解错误发生的上下文。

# 显示包含 "Exception" 的行及其后5行内容
grep -A 5 "Exception" /path/to/your/app.log

2. 管道符 |:组合命令,威力倍增

管道符 | 可以将一个命令的输出作为另一个命令的输入,实现复杂筛选。

组合 tail 和 grep:实时监控并只筛选出包含 "ERROR" 的日志。

tail -f /path/to/your/app.log | grep "ERROR"

组合 cat 和 grep:在整个日志文件中搜索 "Connection timed out" 并忽略大小写。

cat /path/to/your/app.log | grep -i "connection timed out"

组合 less 和 grep:在 less 中直接搜索。

less /path/to/your/app.log     
# 进入less后,输入 /error 即可搜索
四、 使用 systemd 的 journalctl 查看日志

对于使用 systemd 管理的现代Linux发行版(如Ubuntu 16.04+, CentOS 7+),服务日志会被收集到系统日志中,可以使用 journalctl 命令进行统一查看。

常用命令

查看全部日志:显示所有服务的日志。

journalctl

查看特定服务日志:使用 -u 参数。

# 查看 Nginx 服务的日志     
journalctl -u nginx.service

实时跟踪日志:使用 -f 参数。

 # 实时跟踪 MySQL 服务的日志     
journalctl -u mysql.service -f

按时间筛选:使用 --since 和 --until 参数。

# 查看今天的日志     
journalctl --since today
     
# 查看从昨天早上9点到今天早上10点的日志     
journalctl --since "yesterday 09:00" --until "today 10:00"    

按日志级别筛选:使用 -p (priority) 参数。

# 只查看错误(err)及以上级别的日志     
journalctl -p err
五、 查看Docker容器日志

如果你的项目部署在Docker容器中,查看日志的方式会有所不同。

核心命令:docker logs

# 查看指定容器的日志
docker logs <container_id_or_name>

# 实时跟踪容器日志
docker logs -f <container_id_or_name>

# 查看容器日志的最后50行
docker logs --tail 50 <container_id_or_name>

# 组合使用:实时跟踪并筛选错误
docker logs -f <container_id_or_name> | grep "ERROR"
六、 生产环境最佳实践

1. 权限问题

很多系统日志文件只有 root 用户或特定用户组(如 adm)才有读取权限。如果遇到 "Permission denied" 错误,请在命令前加上 sudo

sudo tail -f /var/log/auth.log

2. 日志轮转 (Log Rotation)

为了避免日志文件无限增长占用磁盘空间,Linux系统通常会配置 logrotate 工具。它会定期(如每天或每周)将日志文件重命名、压缩,并创建一个新的空日志文件。因此,你可能会看到类似 app.logapp.log.1app.log.2.gz 这样的文件。查看旧日志时,需要先解压:

zcat /path/to/your/app.log.2.gz | grep "ERROR"

3. 使用专业工具

对于大型或分布式系统,日志分散在多台服务器上,手动查看非常低效。此时应考虑使用专业的日志集中管理与分析工具,如 ELK Stack (Elasticsearch, Logstash, Kibana) 或 Graylog。这些工具可以集中收集、存储、搜索和可视化所有服务器的日志,极大地提升运维效率。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐