4.1 Linux 日志排查

一、/var/log 系统常用日志

日志文件 核心作用 排查场景
/var/log/messages(CentOS/RHEL) /var/log/syslog(Debian/Ubuntu) 系统全局日志,记录系统启动、服务运行、内核、硬件等绝大多数通用信息 系统崩溃、服务异常、硬件故障排查
/var/log/secure 安全相关日志,记录登录验证、sudo 操作、SSH 连接、权限变更等 排查暴力破解、异常登录、权限问题
/var/log/auth.log(Debian/Ubuntu) secure,认证 / 授权日志 同上
/var/log/cron crontab 定时任务的执行日志 排查定时任务不执行、执行报错
/var/log/maillog 邮件服务日志 排查邮件发送 / 接收失败
/var/log/dmesg 内核启动日志,记录硬件检测、驱动加载信息 排查硬件故障、系统启动问题
/var/log/boot.log 系统启动过程日志 排查开机启动失败、服务自启异常
/var/log/yum.log(CentOS) /var/log/apt/(Debian) 软件包安装 / 更新日志 排查 yum/apt 安装失败、依赖问题
/var/log/httpd/ / /var/log/nginx/ Web 服务(Apache/Nginx)的访问日志、错误日志 排查网站访问异常、5xx 错误
/var/log/mysqld.log /var/lib/docker/containers MySQL Docker

二、日志排查的基本思路

2.1 问题定位的三步走

  1. 确定问题发生的时间范围

  2. 选择合适的日志文件

  3. 使用工具快速筛选关键信息

2.2 常见问题类型与对应日志

  • 系统性能问题 → /var/log/messagesdmesg
  • 登录认证问题 → /var/log/secure
  • 网络连接问题 → /var/log/messages、应用日志
  • 磁盘空间问题 → /var/log/messages
  • 服务启动问题 → systemctl statusjournalctl

三、实用的日志查看命令

3.1 基础查看命令

1. tail 命令(实时查看日志,运维必备)

核心作用:查看文件末尾内容,最常用的是实时追踪日志更新

  • 基础用法:

    bash 复制代码
    tail /var/log/messages  # 查看文件最后10行
    tail -n 20 /var/log/messages  # 查看最后20行
    tail -f /var/log/messages  # 实时追踪日志更新(最常用,排查问题必用)
    tail -F /var/log/messages  # 日志轮转后自动追踪新文件(比-f更稳定)
  • 要理解:-f-F的区别,日志轮转的影响

2. less 命令(大文件分页查看,比 cat 更安全)

核心作用:分页查看大日志文件,支持搜索、跳转,不会一次性加载整个文件

  • 基础用法:

    复制代码
    less /var/log/messages  # 打开文件
  • 常用交互操作(必须记住):

    • 空格:向下翻一页;b:向上翻一页
    • G:跳转到文件末尾;gg:跳转到文件开头
    • /关键词:向下搜索关键词;?关键词:向上搜索关键词
    • n:跳转到下一个匹配项;N:跳转到上一个匹配项
    • q:退出 less
  • 优势:大文件(GB 级)用 less 不会卡死,cat 会直接加载整个文件导致系统卡顿

3. journalctl 命令(systemd 系统的日志管理,CentOS7+/Ubuntu16.04+)

核心作用:查看 systemd 管理的服务日志、系统日志,替代传统的/var/log/messages

  • 基础用法:

    复制代码
    journalctl  # 查看所有系统日志(从开机到现在)
    journalctl -f  # 实时追踪日志(类似tail -f)
    journalctl -u nginx.service  # 查看指定服务(如nginx)的日志(最常用)
    journalctl -u crond.service  # 查看定时任务服务日志
    journalctl --since "2026-04-08 10:00:00" --until "2026-04-08 12:00:00"  # 按时间范围查看
    journalctl -k  # 只查看内核日志
    journalctl -p err  # 只查看错误级别日志(快速定位问题)
  • 必须掌握的知识点:

    • journalctl 是 systemd 的日志工具,非 systemd 系统(如 CentOS6)不支持
    • 日志持久化配置:默认日志存在内存,重启丢失,需配置/etc/systemd/journald.conf实现持久化
    • 日志大小限制:避免 journalctl 日志占满磁盘
4. 其他命令
bash 复制代码
# 实时监控多个日志文件
multitail /var/log/messages /var/log/secure

# 查看日志文件头部
head -n 50 /var/log/boot.log

3.2 筛选定位与统计分析

1. 时间筛选
bash 复制代码
# 查看指定日期的日志
grep "Dec 15" /var/log/messages

# 查看指定时间段的日志
sed -n '/Dec 15 10:00/,/Dec 15 11:00/p' /var/log/messages

# 使用awk按时间筛选
awk '/Dec 15 10:/ && /Dec 15 11:/' /var/log/messages
2. 关键字搜索
bash 复制代码
# 基本关键字搜索
grep "error" /var/log/messages

# 忽略大小写搜索
grep -i "failed" /var/log/secure

# 搜索多个关键字
grep -E "error|failed|timeout" /var/log/messages

# 显示匹配行的前后几行
grep -A 5 -B 5 "Out of memory" /var/log/messages
3. 日志统计分析
bash 复制代码
# 统计错误出现次数
grep -c "error" /var/log/messages

# 统计不同类型错误的数量
grep "error" /var/log/messages | awk '{print $5}' | sort | uniq -c

# 分析访问日志中的IP访问频率
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr
4. 日志切割和轮转
bash 复制代码
# 查看logrotate配置
cat /etc/logrotate.conf

# 手动执行日志轮转
logrotate -f /etc/logrotate.conf

# 查看日志轮转状态
cat /var/lib/logrotate/logrotate.status
  1. 全局默认规则
配置项 作用 详细说明
weekly 轮转周期 每周执行一次日志切割 (通常是周日凌晨,由 cron 定时任务触发)
rotate 4 保留份数 只保留 最近 4 份 轮转后的历史日志,第 5 次轮转时,最老的日志会被自动删除
create 新建日志文件 日志被重命名归档后,自动创建一个同名的空日志文件,保证服务可以继续写入日志,不会报错
dateext 日期后缀 轮转后的日志文件用 日期作为后缀 ,例如 messages-20260408;不加这个参数则默认用数字后缀(messages.1messages.2
#compress 日志压缩 当前是注释状态,不压缩日志 ;去掉 # 后,会自动用 gzip 压缩轮转后的日志,节省磁盘空间
include /etc/logrotate.d 包含子配置 加载 /etc/logrotate.d/ 目录下的所有配置文件,比如 syslognginxhttpd 等服务的专属日志轮转规则都在这里配置

二、专属日志配置(wtmp /btmp 登录日志)

这两个是系统登录相关的日志,单独配置了轮转规则,不继承上面的全局默认。

  1. /var/log/wtmp 配置(成功登录记录)

    /var/log/wtmp {
    monthly
    create 0664 root utmp
    minsize 1M
    rotate 1
    }

  • 作用 :记录所有用户的成功登录历史,用 last 命令查看

  • 逐行解析:

    • monthly每月 轮转一次,覆盖全局的 weekly

    • create 0664 root utmp:新建日志文件的权限为 0664,属主 root,属组 utmp

    • minsize 1M:日志文件大小至少 1M 才会触发轮转,小于 1M 不切割

    • rotate 1:只保留 1 份 历史日志

  1. /var/log/btmp 配置(失败登录记录)

    /var/log/btmp {
    missingok
    monthly
    create 0600 root utmp
    rotate 1
    }

  • 作用 :记录所有失败的登录尝试(比如密码输错、暴力破解),用 lastb 命令查看

  • 逐行解析:

    • missingok:如果日志文件不存在,也不会报错,继续执行轮转

    • monthly每月轮转一次

    • create 0600 root utmp:权限 0600(仅 root 可读,保障安全),属主 root,属组 utmp

    • rotate 1:只保留 1 份 历史日志

5. 使用dmesg分析

dmesg命令用于显示内核环形缓冲区的消息,这些消息包含了系统启动时的硬件检测信息和运行时的内核消息。

bash 复制代码
# 查看所有内核消息
dmesg

# 实时查看内核消息
dmesg -w

# 按时间戳显示
dmesg -T

# 只显示错误和警告
dmesg -l err,warn

# 清空dmesg缓冲区(需要root权限)
dmesg -c


# 按级别过滤
dmesg -l emerg    # 紧急情况
dmesg -l alert    # 需要立即处理
dmesg -l crit     # 严重错误
dmesg -l err      # 一般错误
dmesg -l warn     # 警告信息
dmesg -l notice   # 注意信息
dmesg -l info     # 一般信息
dmesg -l debug    # 调试信息

###################dmesg实用技巧##########
# 查看最近的内核消息
dmesg | tail -20

# 搜索特定硬件信息
dmesg | grep -i "usb\|disk\|network"

# 查看内存相关信息
dmesg | grep -i "memory\|oom"

# 查看CPU相关信息
dmesg | grep -i "cpu"

# 将dmesg输出保存到文件【注意 date +(这里不能有空格)%Y...】
dmesg > /tmp/dmesg_$(date +%Y%m%d_%H%M%S).log

四、crontab 定时语法、配置自动任务

1. crontab 时间语法

crontab 的格式为:分 时 日 月 周 要执行的命令

字段 范围 特殊符号 含义
0-59 * 代表每分;, 代表多个;- 代表范围;/ 代表步长
0-23 同上
1-31 同上
1-12 或 jan-dec 同上
0-7(0 和 7 都代表周日) 或 sun-sat 同上
  • 示例:

    复制代码
    # 每天凌晨2点执行备份脚本
    0 2 * * * /root/backup.sh
    # 每5分钟执行一次脚本
    */5 * * * * /root/monitor.sh
    # 每周一凌晨1点执行清理任务
    0 1 * * 1 /root/clean.sh
    # 每月1号凌晨3点执行日志轮转
    0 3 1 * * /usr/sbin/logrotate /etc/logrotate.conf

2. crontab 核心操作命令

复制代码
crontab -e  # 编辑当前用户的定时任务(最常用)
crontab -l  # 查看当前用户的定时任务列表
crontab -r  # 删除当前用户的所有定时任务(谨慎使用!)
crontab -u root -l  # 查看root用户的定时任务(需root权限)

3. 必须掌握的知识点 & 避坑指南

  • 环境变量问题 :crontab 执行时的环境变量和用户登录时不同,命令必须写绝对路径 (如/usr/bin/df,不能只写df
  • 日志排查 :定时任务不执行,优先看/var/log/cron日志,排查语法错误、权限问题
  • 权限控制/etc/cron.allow/etc/cron.deny控制哪些用户可以使用 crontab
  • 系统级定时任务/etc/crontab文件是系统级定时任务,格式多了一个用户名字段(如0 2 * * * root /root/backup.sh
  • 任务执行失败告警:定时任务执行失败会发邮件给 root,可配置邮件告警或脚本捕获错误
  • 避免任务重叠 :用flock锁机制,防止上一个任务没执行完,下一个任务又启动

五、实战案例分析

案例1:系统负载过高排查

bash 复制代码
# 1. 查看系统负载相关日志【CPU过载】
grep -i "load" /var/log/messages

# 2. 查看内存不足相关信息【内存爆了】
grep -i "out of memory" /var/log/messages

# 3. 查看磁盘IO相关问题【磁盘IO阻塞】
grep -i "blocked" /var/log/messages

# 4. 结合dmesg查看内核消息【一般是内存不足导致系统自动杀死进程】
dmesg | grep -i "killed process"

案例2:SSH登录失败排查

bash 复制代码
# 1. 查看SSH登录失败记录【失败原因】
grep "Failed password" /var/log/secure

# 2. 查看SSH服务状态【服务是否正常】
systemctl status sshd
journalctl -u sshd

# 3. 查看防火墙状态【防火墙禁止访问】
systemctl stauts firewalld

# 4. 是不是 禁passwd / root
grep -E "PasswordAuthentication | permitRootLogin" /etc/ssh/sshd_config

案例3:Web服务异常排查

bash 复制代码
# 1. 查看Nginx错误日志【定位错误原因】
tail -f /var/log/nginx/error.log

# 2. 分析访问日志中的异常状态码【分析用户是否能正常访问】
awk '$9 >= 400 {print $0}' /var/log/nginx/access.log

# 3. 统计各种HTTP状态码的数量
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c

# 4. 查看PHP-FPM日志(如果使用PHP)【状态码为500 / 502 通常是后端代码错误】
tail -f /var/log/php-fpm/www-error.log

案例4:内存OOM问题排查

OOM是指系统内存不足时,内核会启动OOM Killer机制,强制杀死一些进程来释放内存。这是Linux系统的自我保护机制。

bash 复制代码
######################OOM日志特征识别##############
# 在dmesg中查找OOM相关信息
dmesg | grep -i "out of memory\|oom\|killed process"

# 在系统日志中查找OOM信息
grep -i "out of memory\|oom-killer\|killed process" /var/log/messages

# 使用journalctl查找OOM(RHEL 7+)
journalctl | grep -i "oom\|out of memory"

六、日志监控和告警

6.1 实时监控脚本

bash 复制代码
#!/bin/bash
# 监控关键错误日志
tail -f /var/log/messages | while read line
do
    if echo "$line" | grep -q "CRITICAL\|FATAL\|Out of memory"; then
        echo "$(date): 发现严重错误 - $line" | mail -s "系统告警" admin@company.com
    fi
done

6.2 使用rsyslog集中管理

1. 服务端
bash 复制代码
# 配置rsyslog服务端
vim /etc/rsyslog.conf

# 将前几行修改为:
[test@k8s-node1 ~]$ head -n 7 /etc/rsyslog.conf
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514

# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514

# 重启并查看状态
systemctl restart rsyslog
systemctl status rsyslog 

# 查看端口是否已在监听
ss -tulnp | grep rsyslog
2. 客户端
bash 复制代码
# 配置rsyslog客户端
echo "*.* @@log-server:514" >> /etc/rsyslog.conf
systemctl restart rsyslog
3. 验证
bash 复制代码
# 服务端实时查看日志
tail -f /var/log/messages

# 客户端输入一条日志
logger "test1"

# 这个时候服务端就会显示test1

七、日志安全和维护

7.1 日志文件权限管理

复制代码
# 设置适当的日志文件权限
chmod 640 /var/log/secure
chown root:adm /var/log/secure

7.2 日志备份策略

复制代码
# 定期备份重要日志
tar -czf /backup/logs-$(date +%Y%m%d).tar.gz /var/log/

八、常用工具推荐

8.1 命令行工具

  • less: 分页查看大文件
  • zcat/zless: 查看压缩日志文件
  • awk/sed: 文本处理和分析
  • multitail: 同时监控多个日志文件

8.2 图形化工具

1. Logwatch : 日志分析和报告工具,生成文本 / HTML 报告,通过邮件或文件输出,无需图形界面。

(1)核心组件:无复杂组件,单命令行工具,依赖系统 crontab 定时执行

(2)安装(CentOS):

复制代码
sudo yum install -y logwatch

(3)核心操作

场景 命令 说明
今日概览 sudo logwatch --range today --detail Med --output stdout 终端输出今日日志摘要
分析 sshd sudo logwatch --service sshd --detail High --output stdout sudo、sshd、cron、syslog、yum 专注分析 SSH 登录失败 / 成功
邮件报告 sudo logwatch --range today --mailto admin@example.com --output mail 配置邮件发送每日报告

(4)定时配置 - Logwatch 由 crontab 每日自动执行:

复制代码
# 编辑定时任务
sudo crontab -e
# 添加每日0点执行
0 0 * * * /usr/bin/logwatch --range today --mailto admin@example.com --output mail

(5) 适用场景

服务器日常巡检,快速发现异常(如 SSH 暴力破解、服务报错);

无需实时分析,只需定期汇总报告的场景。

  • ELK Stack: 企业级日志分析平台

ELK stack 的使用-CSDN博客

ELK 监控nginx-CSDN博客

  • Graylog: 开源日志管理平台

整体流程:

  • 配置阶段:
    • 用户通过 Graylog Web Interface 配置告警规则、用户权限、Pipeline 等;配置信息存入 MongoDB,Graylog Server 加载并编译这些规则。
  • 日志采集与处理阶段:
    • 日志源发送日志到 Graylog Server,经过 Pipeline 解析、清洗、丰富化。
    • 处理过程中,若匹配实时告警规则,Graylog Server 直接触发告警通知。
    • 处理完成的日志写入 Elasticsearch 持久化存储。
  • 用户查询与分析阶段:
    • 用户在 Web 界面发起日志查询或查看仪表板,请求发送到 Graylog Server,由 Graylog Server 从 Elasticsearch 拉取日志数据,返回给界面渲染展示。
  • 定时聚合告警(补充场景):
    • Graylog Server 按设定的时间间隔,主动查询 Elasticsearch,做聚合统计后判断是否触发告警。
相关推荐
实心儿儿8 小时前
Linux —— 应用层协议HTTP
linux·网络·http
流星白龙8 小时前
【Docker】4.NameSpace空间隔离实战
java·运维·docker
有续技术9 小时前
哈斯 (Haas) 机床 IP、端口号配置内容总结
运维·服务器
小张同学a.9 小时前
LAMP架构2
linux·运维·网络·架构·负载均衡
千河殇 多想和她9 小时前
如何在Reaonix中使用CodeGraph以及CodeGraph效果实测经验分享
linux·运维·ubuntu
VortMall9 小时前
出海引流运维双升级|VortMall微服务商城系统v1.3.12 升级更新
运维·微服务·facebook
心念枕惊9 小时前
新写了个直播录制工具,可录制抖音快手斗鱼直播
运维·服务器·数据库
躺不平的理查德10 小时前
CMAKE备忘录
linux·运维·服务器
96245610 小时前
跨域与私有网络访问限制排查实录
运维·服务器·网络
发量惊人的中年网工10 小时前
SD-WAN如何赋能工业物联网?打造工厂网络远程连接和数据传输新方案
运维·网络·分布式·物联网