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,做聚合统计后判断是否触发告警。
相关推荐
小狗爱吃黄桃罐头1 小时前
宋宝华:原理和实战解析Linux中如何正确地使用内存屏障
linux·内存屏障
山上三树1 小时前
操作系统如何实现各种功能
linux·运维·服务器
妹妹够啦1 小时前
PyCharm创建venv环境
linux·运维·服务器
Tim风声(网络工程师)2 小时前
iMaster NCE-Campus和iMaster NCE-Fabric的区别
运维·fabric
我爱小疯喵喵2 小时前
5 Linux apt下载软件包
linux·运维·服务器
坚持就完事了2 小时前
Linux中的tr命令
linux·运维·服务器
xingyuzhisuan2 小时前
影视动画渲染租用RTX4090 GPU服务器的优势及选型指南
运维·服务器·ai编程·gpu算力
TG_yunshuguoji2 小时前
阿里云代理商:DeepSeek V4 API接入全攻略 + 云服务器部署指南
运维·阿里云·云计算·ai智能体·deepseek-v4
很懒的程序员雄2 小时前
eNSP企业级复杂拓扑
运维·服务器·网络