【Linux运维极简教程】10-日志管理与故障排查
10 - 日志管理与故障排查一、Linux 日志体系1.1 日志服务现代 Linux 使用systemd-journald和rsyslog两套日志系统服务特点日志位置journald二进制格式结构化易查询/run/log/journal/rsyslog文本格式可定制传统方案/var/log/1.2 常见日志文件日志文件内容/var/log/messages系统通用日志CentOS/var/log/syslog系统通用日志Ubuntu/var/log/secure安全日志登录、sudoCentOS/var/log/auth.log安全日志Ubuntu/var/log/croncron 定时任务日志/var/log/maillog邮件服务日志/var/log/dmesg内核启动日志/var/log/boot.log系统启动日志/var/log/yum.logyum 安装日志CentOS/var/log/dpkg.logdpkg 安装日志Ubuntu1.3 应用日志常见位置/var/log/nginx/ # Nginx 日志 /var/log/mysql/ # MySQL 日志 /var/log/httpd/ # Apache 日志 /var/lib/docker/ # Docker 日志 /opt/app/logs/ # 自定义应用日志二、journalctl - 日志查询利器2.1 基本查询# 查看所有日志journalctl# 查看最新日志并持续追踪类似 tail -fjournalctl-f# 查看最后 N 条journalctl-n50# 查看今天的日志journalctl--sincetoday# 指定时间范围journalctl--since2024-01-15 09:00:00--until2024-01-15 12:00:00journalctl--since1 hour agojournalctl--since30 min ago2.2 按服务/单元查询# 查看指定服务的日志journalctl-unginx journalctl-usshd-f# 实时追踪journalctl-unginx--sincetoday# 查看多个服务journalctl-unginx-uphp-fpm2.3 按优先级查询# 日志优先级0-7# 0 emerg 紧急# 1 alert 警报# 2 crit 严重# 3 err 错误# 4 warning 警告# 5 notice 通知# 6 info 信息# 7 debug 调试# 只看错误及以上journalctl-perr# 查看指定级别journalctl-pwarning# 查看某级别及以上journalctl-pwarning..err2.4 按其他条件查询# 按进程 PIDjournalctl_PID1234# 按用户journalctl_UID1000# 按可执行文件journalctl /usr/bin/nginx# 按设备journalctl /dev/sda# 只显示内核日志journalctl-k# 只显示本次启动的日志journalctl-b# 查看上一次启动的日志journalctl-b-1# 以 JSON 格式输出journalctl-ojson journalctl-ojson-pretty2.5 journal 持久化默认 journal 日志存储在/run/log/journal/重启后会丢失。配置持久化# 创建持久化目录mkdir-p/var/log/journal systemd-tmpfiles--create--prefix/var/log/journal# 重启 journaldsystemctl restart systemd-journald# 配置日志大小限制# 编辑 /etc/systemd/journald.conf[Journal]Storagepersistent# 持久化存储SystemMaxUse500M# 最大使用 500MBSystemKeepFree1G# 至少保留 1GB 空闲MaxRetentionSec30day# 保留 30 天# 查看磁盘使用journalctl --disk-usage# 清理日志journalctl --vacuum-time7d# 清理 7 天前的journalctl --vacuum-size200M# 只保留 200MB三、rsyslog 配置3.1 配置文件# 主配置文件/etc/rsyslog.conf# 子配置目录/etc/rsyslog.d/*.conf3.2 配置语法# 格式设施.级别 动作 # 设施auth, authpriv, cron, daemon, kern, mail, user, local0-7, * # 级别debug, info, notice, warning, err, crit, alert, emerg, * # 动作文件路径主机(IP)|程序 # 示例 *.info;mail.none;authpriv.none;cron.none /var/log/messages authpriv.* /var/log/secure mail.* /var/log/maillog cron.* /var/log/cron *.emerg :omusrmsg:* local7.* /var/log/boot.log3.3 自定义应用日志# 让应用日志通过 rsyslog 管理cat/etc/rsyslog.d/myapp.confEOF if $programname myapp then /var/log/myapp/app.log stop EOFsystemctl restart rsyslog# 应用中使用 logger 命令写入日志logger-tmyappApplication startedlogger-tmyapp-plocal0.infoInfo messagelogger-tmyapp-plocal0.errError message四、日志分析技巧4.1 grep 搜索# 搜索关键词greperror/var/log/messages# 忽略大小写grep-ierror/var/log/messages# 显示行号grep-nerror/var/log/messages# 显示上下文grep-C3error/var/log/messages# 前后各 3 行grep-B2error/var/log/messages# 前 2 行grep-A5error/var/log/messages# 后 5 行# 统计错误数量grep-cerror/var/log/messages# 多关键词grep-Eerror|warning|fail/var/log/messages4.2 统计与分析# 统计 IP 访问次数Nginx 日志awk{print $1}/var/log/nginx/access.log|sort|uniq-c|sort-rn|head-20# 统计 HTTP 状态码分布awk{print $9}/var/log/nginx/access.log|sort|uniq-c|sort-rn# 统计访问最多的 URLawk{print $7}/var/log/nginx/access.log|sort|uniq-c|sort-rn|head-20# 统计每小时的访问量awk{print $4}/var/log/nginx/access.log|cut-c14-15|sort|uniq-c# 找出 404 错误grep 404 /var/log/nginx/access.log|awk{print $7}|sort|uniq-c|sort-rn# 找出响应慢的请求awk($NF 3){print $7, $NF}/var/log/nginx/access.log|sort-k2-rn|head-104.3 多文件搜索# 在多个日志文件中搜索greperror/var/log/nginx/*.log# 递归搜索grep-rnconfig/etc/# 只在特定时间范围搜索awk/2024-01-15 10:/{p1} /2024-01-15 11:/{p0} p/var/log/messages五、logrotate 日志轮转logrotate 自动切割、压缩和清理日志文件。5.1 配置文件# 主配置/etc/logrotate.conf# 子配置目录/etc/logrotate.d/5.2 配置示例# /etc/logrotate.d/nginx/var/log/nginx/*.log{daily# 每天轮转rotate30# 保留 30 份missingok# 日志不存在不报错compress# 压缩旧日志delaycompress# 延迟压缩最近一份不压缩notifempty# 空文件不轮转create 0640 nginx adm# 创建新日志文件的权限sharedscripts# 多个日志匹配时脚本只执行一次postrotate# 轮转后执行的脚本if[-f/var/run/nginx.pid];thenkill-USR1$(cat/var/run/nginx.pid)fiendscript}5.3 常用参数参数说明daily/weekly/monthly轮转周期rotate N保留 N 份旧日志size 100M超过 100MB 时轮转compress压缩旧日志delaycompress延迟一轮再压缩missingok日志不存在不报错notifempty空日志不轮转copytruncate复制后截断原文件不重启服务create创建新的日志文件postrotate/endscript轮转后执行脚本5.4 手动执行与调试# 手动执行所有轮转logrotate/etc/logrotate.conf# 调试模式只显示会做什么不实际执行logrotate-d/etc/logrotate.d/nginx# 强制执行logrotate-f/etc/logrotate.d/nginx# 查看轮转状态cat/var/lib/logrotate/logrotate.status六、故障排查方法论6.1 排查思路发现问题 → 定位范围 → 查看日志 → 分析原因 → 解决问题 → 记录归档6.2 常见故障排查服务无法启动# 1. 查看服务状态会显示错误信息systemctl status nginx# 2. 查看详细日志journalctl-unginx--since10 min ago# 3. 检查配置文件语法nginx-thttpd-tsshd-t# 4. 查看应用自身日志tail-50/var/log/nginx/error.log# 5. 检查端口冲突ss-tlnp|grep:80系统变慢# 1. 查看系统负载uptimetop# 2. 查看高 CPU 进程ps-eopid,user,%cpu,%mem,command--sort-%cpu|head-10# 3. 查看高内存进程ps-eopid,user,%cpu,%mem,command--sort-%mem|head-10# 4. 查看 IO 等待iostat-x13iotop# 查看哪个进程在做 IO# 5. 检查磁盘空间df-hSSH 无法登录# 在服务器上排查需要通过其他方式登录如控制台# 1. 检查 sshd 服务systemctl status sshd# 2. 查看安全日志# CentOStail-50/var/log/secure# Ubuntutail-50/var/log/auth.log# 3. 检查 sshd 配置sshd-t# 语法检查grep-E^(PermitRootLogin|PasswordAuthentication|AllowUsers)/etc/ssh/sshd_config# 4. 检查防火墙firewall-cmd --list-all iptables-L-n|grep22# 5. 检查 PAM 限制cat/etc/security/limits.conf|grep-v^#网络不通# 1. 检查网卡状态iplinkshowipaddr show# 2. 检查路由iproute showpinggatewayping8.8.8.8# 3. 检查 DNSdigexample.comcat/etc/resolv.conf# 4. 抓包分析tcpdump-ieth0-nnhosttarget_ip磁盘空间满# 1. 查看分区使用df-h# 2. 找大文件du-sh/*2/dev/null|sort-rh|head-10find/-typef-size1G2/dev/null# 3. 检查 inode 是否耗尽df-ifind/-typef|wc-l# 4. 检查已删除但未释放的文件lsofL1|grepdeleted# 或lsof|grepdeleted# 5. 清理常见日志journalctl --vacuum-size100Mfind/var/log-name*.gz-mtime30-delete七、实战场景场景一分析 SSH 暴力破解#!/bin/bash# 分析 SSH 登录失败记录统计攻击 IPecho SSH 登录失败统计 echo# CentOSgrepFailed password/var/log/secure|awk{print $(NF-3)}|sort|uniq-c|sort-rn|head-20# Ubuntu# grep Failed password /var/log/auth.log | awk {print $(NF-3)} | sort | uniq -c | sort -rn | head -20echoecho 成功登录记录 grepAccepted password/var/log/secure|tail-10echoecho 最近登录用户 last-20场景二一键系统诊断脚本#!/bin/bash# system_diagnose.sh - 快速诊断系统状态echoecho 系统诊断报告 -$(date)echoechoecho--- 系统信息 ---echo主机名:$(hostname)echo系统:$(cat/etc/os-release|grepPRETTY_NAME|cut-d-f2)echo内核:$(uname-r)echo运行时间:$(uptime-p)echoecho--- 负载情况 ---uptimeechoecho--- CPU 使用 TOP5 ---ps-eopid,user,%cpu,%mem,comm--sort-%cpu|head-6echoecho--- 内存使用 ---free-hechoecho内存使用 TOP5:ps-eopid,user,%cpu,%mem,comm--sort-%mem|head-6echoecho--- 磁盘空间 ---df-h|grep-vtmpfsechoecho--- 磁盘 IO ---iostat-x112/dev/null|tail-n4||echoiostat 未安装echoecho--- 网络连接数 ---echoTCP 连接总数:$(ss-tn|tail-n2|wc-l)echoTIME_WAIT:$(ss-tnstate TIME-WAIT|wc-l)echoESTABLISHED:$(ss-tnstate ESTABLISHED|wc-l)echoecho--- 监听端口 ---ss-tlnp|head-20echoecho--- 最近错误日志 ---journalctl-perr--since1 hour ago--no-pager|tail-20echoechoecho 诊断完成echo八、小结本篇介绍了 Linux 日志体系journald rsyslog、journalctl 查询技巧、日志分析命令、logrotate 日志轮转以及系统故障排查方法论。日志是排查问题的金矿熟练使用日志查询和分析工具是运维工程师的核心能力。上一篇09 - 定时任务与自动化运维下一篇11 - 防火墙与安全加固