1. Linux 日志系统基础
1.1 Linux 日志类型
| 类型 | 说明 | 管理工具 |
|---|
| 系统日志 | 内核、系统服务日志 | rsyslog, syslog-ng |
| 系统日记志 | systemd 服务日志 | journalctl |
| 应用日志 | 各应用程序日志 | 各自管理 |
| 安全日志 | 认证、授权日志 | auditd, pam |
| 内核日志 | 内核消息 | dmesg, /proc/kmsg |
1.2 日志守护进程
rsyslog(传统 syslog)
# 检查状态systemctl status rsyslog# 配置文件/etc/rsyslog.conf/etc/rsyslog.d/# 重启服务systemctl restart rsyslog# 测试配置rsyslogd -N1
systemd-journald(现用系统)
# 检查状态systemctl status systemd-journald# 配置文件/etc/systemd/journald.conf# 查看日志占用空间journalctl --disk-usage# 限制日志大小# 编辑 /etc/systemd/journald.conf# SystemMaxUse=500M
1.3 日志级别
| 级别 | 数值 | 说明 |
|---|
| EMERG | 0 | 系统不可用 |
| ALERT | 1 | 需要立即行动 |
| CRIT | 2 | 严重错误 |
| ERR | 3 | 错误 |
| WARNING | 4 | 警告 |
| NOTICE | 5 | 正常但重要 |
| INFO | 6 | 信息 |
| DEBUG | 7 | 调试 |
2. 日志文件位置与用途
2.1 系统日志目录
# 主要日志目录/var/log/ # 日志主目录/var/log/journal/ # systemd 日志(二进制)/var/log/audit/ # 审计日志
2.2 常见日志文件
| 日志文件 | 用途 | 相关服务 |
|---|
/var/log/messages | 系统综合日志 | rsyslog |
/var/log/syslog | 系统日志(Debian) | rsyslog |
/var/log/kern.log | 内核日志 | kernel |
/var/log/auth.log | 认证日志(Debian) | sshd, sudo |
/var/log/secure | 安全日志(RHEL) | sshd, sudo |
/var/log/boot.log | 启动日志 | systemd |
/var/log/dmesg | 硬件检测日志 | kernel |
/var/log/cron | 定时任务日志 | crond |
/var/log/maillog | 邮件日志 | postfix, sendmail |
/var/log/yum.log | YUM 包管理日志 | yum |
/var/log/dpkg.log | DPKG 包管理日志 | dpkg |
2.3 应用日志位置
| 应用 | 日志位置 |
|---|
| Nginx | /var/log/nginx/ |
| Apache | /var/log/httpd/ 或 /var/log/apache2/ |
| MySQL | /var/log/mysql/ 或 /var/log/mysqld.log |
| Redis | /var/log/redis/ |
| Docker | /var/log/docker/ 或 docker logs |
| Tomcat | /var/log/tomcat/ 或 $CATALINA_HOME/logs/ |
| Jenkins | /var/log/jenkins/ |
| GitLab | /var/log/gitlab/ |
2.4 查看日志文件属性
# 查看日志文件大小ls -lh /var/log/# 查看日志文件权限ls -la /var/log/secure# 查看日志文件类型file /var/log/messages# 查看日志文件最后修改时间stat /var/log/syslog# 实时查看日志文件大小变化watch -n1 'ls -lh /var/log/*.log'
3. 日志抓取方法
3.1 journalctl 命令详解
基础用法
# 查看所有日志journalctl# 查看最后 100 行journalctl -n 100# 实时跟踪日志journalctl -f# 实时跟踪并显示最后 50 行journalctl -fn 50# 按时间范围查看journalctl --since "2026-03-20 09:00:00"journalctl --until "2026-03-20 10:00:00"journalctl --since "1 hour ago"journalctl --since "10 min ago" --until "now"# 查看本次启动以来的日志journalctl -b# 查看上次启动的日志journalctl -b -1# 列出所有启动记录journalctl --list-boots# 按优先级过滤journalctl -p err # 错误及以上journalctl -p warning # 警告及以上journalctl -p info # 信息及以上# 查看特定服务的日志journalctl -u sshdjournalctl -u nginxjournalctl -u dockerjournalctl -u mysql# 查看多个服务journalctl -u nginx -u mysql# 按进程 ID 查看journalctl _PID=1234# 按可执行文件查看journalctl /usr/sbin/nginx# 按用户查看journalctl _UID=1000# 按系统单元查看journalctl _SYSTEMD_UNIT=sshd.service# 输出格式控制journalctl -o short # 默认格式journalctl -o verbose # 详细格式journalctl -o json # JSON 格式journalctl -o cat # 只显示日志内容# 导出日志journalctl > all.logjournalctl -b > boot.logjournalctl -u nginx > nginx.log
高级过滤
# 组合条件journalctl -u nginx --since "1 hour ago" -p err# 排除特定内容journalctl | grep -v "DEBUG"# 统计日志数量journalctl --since "1 hour ago" | wc -l# 查看内核消息journalctl -k# 查看引导消息journalctl -b --boot-id=xxx# 清理旧日志journalctl --vacuum-time=7d # 保留 7 天journalctl --vacuum-size=500M # 保留 500Mjournalctl --rotate # 轮转日志
3.2 grep 日志搜索
# 基础搜索grep "error" /var/log/messagesgrep "Failed" /var/log/auth.log# 忽略大小写grep -i "error" /var/log/messages# 显示行号grep -n "error" /var/log/messages# 显示匹配行数grep -c "error" /var/log/messages# 递归搜索grep -r "error" /var/log/# 显示匹配前后文grep -A 5 "error" /var/log/messages # 后 5 行grep -B 5 "error" /var/log/messages # 前 5 行grep -C 5 "error" /var/log/messages # 前后各 5 行# 多条件搜索grep -E "error|warning|critical" /var/log/messagesgrep "error" /var/log/messages | grep "nginx"# 排除特定内容grep -v "DEBUG" /var/log/app.loggrep "error" /var/log/messages | grep -v "ignored"# 只匹配完整单词grep -w "error" /var/log/messages# 只显示匹配内容grep -o "ERROR[^ ]*" /var/log/messages# 统计每个文件的匹配数grep -c "error" /var/log/*.log# 列出包含匹配的文件grep -l "error" /var/log/*.log
3.3 awk 日志分析
# 提取特定字段awk '{print $1, $2, $3}' /var/log/messages # 提取时间戳awk '{print $5}' /var/log/auth.log # 提取进程名# 统计每个 IP 的访问次数awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn# 统计每个小时的请求数awk -F: '{print $2}' /var/log/nginx/access.log | cut -d' ' -f1 | sort | uniq -c# 提取错误类型并统计awk '/ERROR/ {print $5}' /var/log/app.log | sort | uniq -c | sort -rn# 计算响应时间平均值awk '{sum+=$NF; count++} END {print sum/count}' access.log# 提取特定状态码awk '$9 == 404' /var/log/nginx/access.logawk '$9 == 500' /var/log/nginx/access.log# 提取慢查询awk '$NF > 1' /var/log/mysql/slow.log# 格式化输出awk '/Failed/ {printf "%-20s %-15s %s\n", $1, $2, $11}' /var/log/auth.log
3.4 sed 日志处理
# 提取特定行sed -n '100,200p' /var/log/messages # 提取 100-200 行sed -n '/error/,/end/p' /var/log/app.log # 提取错误段# 删除特定行sed '/DEBUG/d' /var/log/app.log # 删除 DEBUG 行sed '/^$/d' /var/log/app.log # 删除空行# 替换内容sed 's/password/*****/g' /var/log/app.log # 脱敏密码# 提取 IP 地址sed -n 's/.*\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\).*/\1/p' /var/log/access.log# 提取时间戳sed -n 's/^\([A-Za-z]* *[0-9]* [0-9:]*\).*/\1/p' /var/log/messages
3.5 实时日志监控
# tail 实时监控tail -f /var/log/messagestail -f /var/log/nginx/access.logtail -f /var/log/nginx/error.log# 同时监控多个文件tail -f /var/log/nginx/*.logtail -f /var/log/{messages,secure,cron}# 显示最后 N 行并跟踪tail -100f /var/log/messages# 使用 multitail(需要安装)multitail /var/log/messages /var/log/secure# 带颜色高亮tail -f /var/log/messages | grep --color=auto -E "error|warning|critical"# 带时间戳监控tail -f /var/log/app.log | while read line; do echo "$(date '+%F %T')$line"; done# 监控并记录tail -f /var/log/messages | tee -a monitor.log
3.6 日志轮转与归档
# 查看轮转配置cat /etc/logrotate.confls -la /etc/logrotate.d/# 手动轮转日志logrotate -f /etc/logrotate.conflogrotate -f /etc/logrotate.d/nginx# 压缩旧日志gzip /var/log/messages-20260320gzip -r /var/log/old/# 解压日志gunzip /var/log/messages-20260320.gzzcat /var/log/messages-20260320.gz | grep "error"# 查看压缩日志内容zgrep "error" /var/log/messages-20260320.gzzcat /var/log/messages-20260320.gz | less# 归档日志tar -czf /backup/logs_$(date +%Y%m%d).tar.gz /var/log/
4. 系统故障排查
4.1 启动故障
查看启动日志
# 查看本次启动日志journalctl -b# 查看启动失败的服务systemctl --failed# 查看启动时间systemd-analyzesystemd-analyze blame # 分析各服务启动时间systemd-analyze critical-chain # 查看关键链# 查看内核启动消息dmesg | lessdmesg -T | less # 带时间戳dmesg | grep -i errordmesg | grep -i fail# 查看 boot.logcat /var/log/boot.loggrep -i "fail" /var/log/boot.log# 查看上次启动日志(如果系统重启过)journalctl -b -1
常见启动问题
# 文件系统错误dmesg | grep -i "ext4\|xfs\|fsck"journalctl -b | grep -i "mount\|filesystem"# 硬件检测失败dmesg | grep -i "hardware\|device\|disk"# 服务启动失败systemctl list-units --state=failedjournalctl -b -p err# 驱动问题dmesg | grep -i "driver\|module\|firmware"lsmodmodprobe -r <module> && modprobe <module>
4.2 系统崩溃排查
查看崩溃信息
# 查看内核崩溃日志dmesg | grep -i "panic\|oops\|bug"cat /var/crash/*# 查看 OOM(内存溢出)日志grep -i "out of memory" /var/log/messagesgrep -i "killed process" /var/log/messagesjournalctl | grep -i "oom"# 查看系统宕机前日志journalctl -b -1 --since "10 min ago"journalctl -b -1 -p err# 分析崩溃转储crash /var/crash/vmcore
OOM 问题分析
# 查找 OOM 杀手记录grep -i "oom" /var/log/messages | tail -20journalctl | grep -i "oom-killer" | tail -20# 查看被杀死的进程grep "Killed process" /var/log/messages# 查看内存状态free -hcat /proc/meminfo# 查看进程内存使用ps aux --sort=-%mem | head -10top -o %MEM# 调整 OOM 优先级cat /proc/<pid>/oom_score_adjecho -500 > /proc/<pid>/oom_score_adj
4.3 磁盘故障排查
磁盘空间问题
# 查看磁盘使用df -hdf -i # 查看 inode 使用# 查找大文件find / -type f -size +100M -exec ls -lh {} \; 2>/dev/nullfind / -type f -size +500M -exec ls -lh {} \; 2>/dev/nullfind / -type f -size +1G -exec ls -lh {} \; 2>/dev/null# 按目录统计大小du -sh /* 2>/dev/null | sort -rh | head -20du -sh /var/log/* 2>/dev/null | sort -rh# 查找可清理的文件find /var/log -name "*.gz" -mtime +30find /tmp -type f -atime +7find / -name "*.log" -size +100M# 查看已删除但仍被占用的文件lsof | grep deleted | awk '{print $1, $2, $4, $7, $9}'
磁盘 IO 问题
# 查看磁盘 IO 统计iostat -x 1 5iostat -d 1 5# 查看进程 IOiotoppidstat -d 1# 查看磁盘错误dmesg | grep -i "error\|fail\|sector"smartctl -a /dev/sda# 查看挂载点状态mount | grep -v "cgroup\|tmpfs"cat /proc/mounts
磁盘健康检查
# SMART 检测smartctl -H /dev/sdasmartctl -a /dev/sda# 检查坏道badblocks -sv /dev/sda# 查看磁盘温度smartctl -A /dev/sda | grep -i temperature# 查看磁盘寿命(SSD)smartctl -A /dev/sda | grep -i "wear\|lifetime\|percent"
4.4 内存故障排查
# 查看内存使用free -hcat /proc/meminfo# 查看内存详情vmstat 1 5vmstat -s# 查看进程内存ps aux --sort=-%mem | head -10top -o %MEM# 查看内存错误dmesg | grep -i "memory\|ram\|ecc"grep -i "edac" /var/log/messages# 查看 swap 使用swapon -scat /proc/swaps# 内存泄漏检测valgrind --leak-check=full ./program
5. 服务故障排查
5.1 服务状态检查
# 查看服务状态systemctl status <service>systemctl status sshdsystemctl status nginx# 查看服务日志journalctl -u <service>journalctl -u sshd -f# 查看服务失败原因systemctl status <service> --no-pagerjournalctl -u <service> -p err# 查看服务依赖systemctl list-dependencies <service># 查看服务启动时间systemctl show <service> | grep -i "activeenter"
5.2 SSH 服务故障
# 查看 SSH 日志journalctl -u sshdgrep "sshd" /var/log/auth.loggrep "sshd" /var/log/secure# 查看失败登录grep "Failed" /var/log/auth.log | tail -20grep "Failed password" /var/log/secure | tail -20# 查看成功登录grep "Accepted" /var/log/auth.log | tail -20# 查看暴力破解尝试grep "Failed" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -rn# 查看 SSH 配置sshd -Tcat /etc/ssh/sshd_config# 测试 SSH 连接ssh -v user@hostssh -vvv user@host
5.3 Web 服务故障(Nginx/Apache)
Nginx 故障排查
# 查看 Nginx 状态systemctl status nginxnginx -t # 测试配置# 查看错误日志tail -100f /var/log/nginx/error.loggrep -i "error" /var/log/nginx/error.log | tail -50# 查看访问日志tail -100f /var/log/nginx/access.log# 分析 4xx 错误grep " 4[0-9][0-9] " /var/log/nginx/access.log | tail -20# 分析 5xx 错误grep " 5[0-9][0-9] " /var/log/nginx/access.log | tail -20# 统计状态码awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -rn# 查看慢请求awk '$NF > 1' /var/log/nginx/access.log | sort -t$'\t' -k9 -rn | head -20# 查看热门 URLawk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20# 查看热门 IPawk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20
Apache 故障排查
# 查看 Apache 状态systemctl status httpdsystemctl status apache2apachectl configtest# 查看错误日志tail -100f /var/log/httpd/error_logtail -100f /var/log/apache2/error.log# 查看访问日志tail -100f /var/log/httpd/access_logtail -100f /var/log/apache2/access.log# 分析错误类型grep -i "error" /var/log/httpd/error_log | awk '{print $7}' | sort | uniq -c | sort -rn
5.4 数据库故障排查
MySQL/MariaDB
# 查看 MySQL 状态systemctl status mysqldsystemctl status mariadb# 查看错误日志tail -100f /var/log/mysql/error.logtail -100f /var/log/mysqld.logjournalctl -u mysqld# 查看慢查询tail -100f /var/log/mysql/slow.logmysqldumpslow /var/log/mysql/slow.log# 查看当前连接mysql -e "SHOW PROCESSLIST;"mysql -e "SHOW STATUS LIKE 'Threads%';"# 查看锁等待mysql -e "SELECT * FROM information_schema.INNODB_LOCK_WAITS;"# 查看缓冲池mysql -e "SHOW ENGINE INNODB STATUS\G" | grep -A 20 "BUFFER POOL"
Redis
# 查看 Redis 状态systemctl status redisredis-cli info# 查看 Redis 日志tail -100f /var/log/redis/redis.logjournalctl -u redis# 查看内存使用redis-cli info memory# 查看慢查询redis-cli slowlog get 10redis-cli config get slowlog-log-slower-than# 查看连接redis-cli client list
5.5 Docker 容器故障
# 查看容器状态docker ps -adocker stats# 查看容器日志docker logs <container_id>docker logs -f <container_id>docker logs --tail 100 <container_id># 查看容器详情docker inspect <container_id># 查看容器资源使用docker stats <container_id># 进入容器调试docker exec -it <container_id> /bin/bashdocker exec -it <container_id> /bin/sh# 查看 Docker 服务日志journalctl -u docker
6. 网络故障排查
6.1 网络连通性
# 测试连通性ping -c 4 8.8.8.8ping -c 4 www.google.com# 跟踪路由traceroute 8.8.8.8tracepath 8.8.8.8mtr 8.8.8.8# 测试端口连通性telnet host 80nc -zv host 80nc -zv host 443# DNS 解析测试nslookup www.google.comdig www.google.comhost www.google.com# 查看本地 DNS 缓存systemd-resolve --statistics
6.2 网络接口状态
# 查看接口状态ip addr showip link showifconfig -a# 查看接口统计ip -s link shownetstat -i# 查看接口错误ip -s link | grep -A 1 "eth0"dmesg | grep -i "eth0\|network\|link"# 查看路由表ip route showroute -n# 查看 ARP 表ip neigh showarp -a
6.3 网络连接分析
# 查看所有连接netstat -anss -an# 查看监听端口netstat -tlnpss -tlnp# 查看 ESTABLISHED 连接netstat -an | grep ESTABLISHEDss -t state established# 查看 TIME_WAIT 连接netstat -an | grep TIME_WAIT | wc -lss -t state time-wait | wc -l# 查看连接统计netstat -sss -s# 按状态统计netstat -an | awk '{print $6}' | sort | uniq -css -t | awk '{print $1}' | sort | uniq -c# 查看进程网络连接netstat -tlnp | grep <port>ss -tlnp | grep <port>lsof -i :<port>
6.4 网络性能分析
# 实时网络流量iftopnethogsiptraf# 查看网络统计cat /proc/net/devsar -n DEV 1 5# 查看 TCP 统计netstat -s | grep -i "retrans\|drop\|error"ss -s# 查看网络错误dmesg | grep -i "network\|eth\|drop\|error"ip -s link | grep -i "drop\|error"# TCP 连接分析ss -tan | awk '{print $1}' | sort | uniq -c
6.5 防火墙排查
# 查看 iptables 规则iptables -L -n -viptables -L -n -v --line-numbers# 查看 NAT 规则iptables -t nat -L -n -v# 查看丢弃的数据包iptables -L -n -v | grep DROPdmesg | grep -i "iptables\|firewall"# 查看 firewalld 状态systemctl status firewalldfirewall-cmd --list-all# 查看 ufw 状态ufw status verboseufw status numbered# 测试端口开放nmap -p 22,80,443 localhosttelnet localhost 22
6.6 网络日志分析
# 查看网络连接日志grep "connection" /var/log/messages | tail -50# 查看防火墙日志grep "iptables" /var/log/messages | tail -50grep "firewalld" /var/log/messages | tail -50journalctl -u firewalld# 查看 SSH 连接日志grep "sshd" /var/log/auth.log | grep "connection" | tail -20# 分析网络攻击grep "Failed" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -rn | head -10
7. 性能问题分析
7.1 CPU 性能分析
# 查看 CPU 使用率tophtopuptime# 查看 CPU 详情cat /proc/cpuinfolscpu# 查看进程 CPU 使用ps aux --sort=-%cpu | head -10pidstat -u 1 5# 查看 CPU 等待vmstat 1 5mpstat -P ALL 1 5# 查看负载cat /proc/loadavgw# 分析 CPU 瓶颈perf topperf stat -e cycles,instructions,cache-references,cache-misses -p <pid>
7.2 内存性能分析
# 查看内存使用free -hcat /proc/meminfo# 查看进程内存ps aux --sort=-%mem | head -10pidstat -r 1 5# 查看 swap 使用swapon -scat /proc/swaps# 查看内存统计vmstat 1 5sar -r 1 5# 分析内存泄漏cat /proc/<pid>/status | grep -i "vm"
7.3 磁盘 IO 性能分析
# 查看磁盘 IOiostat -x 1 5iostat -d 1 5# 查看进程 IOpidstat -d 1 5iotop# 查看磁盘队列iostat -x | grep -E "Device|sda"# 查看 IO 等待vmstat 1 5 | grep -E "r|b|swpd|free|buff|cache|si|so|bi|bo|in|cs|wa"# 分析 IO 瓶颈pidstat -d | grep -v "PID"
7.4 综合性能分析工具
# sar 系统活动报告sar -u 1 5 # CPUsar -r 1 5 # 内存sar -b 1 5 # IOsar -n DEV 1 5 # 网络sar -q 1 5 # 负载# 生成性能报告sar -A > performance_report.txt# 查看历史数据sar -f /var/log/sa/sa20# 实时综合监控dstatglancesatop
7.5 性能问题日志分析
# 查找性能相关日志grep -i "slow\|timeout\|latency" /var/log/messagesgrep -i "high load\|memory\|disk" /var/log/messages# 查找资源耗尽日志grep -i "out of\|exhausted\|full" /var/log/messagesgrep -i "no space\|no memory" /var/log/messages# 分析应用性能日志grep "response_time" /var/log/app.log | awk '{print $NF}' | sort -n | tail -20grep "slow_query" /var/log/mysql/slow.log | tail -20
8. 安全事件排查
8.1 登录安全审计
# 查看成功登录grep "Accepted" /var/log/auth.log | tail -20grep "session opened" /var/log/auth.log | tail -20last | head -20# 查看失败登录grep "Failed" /var/log/auth.log | tail -20grep "authentication failure" /var/log/auth.log | tail -20# 查看暴力破解grep "Failed password" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -rn | head -10# 查看 sudo 使用grep "sudo" /var/log/auth.log | tail -20grep "COMMAND" /var/log/auth.log | tail -20# 查看异常登录时间grep "Accepted" /var/log/auth.log | awk '{print $1, $2, $3, $9, $11}'# 查看异地登录last -i | head -20
8.2 审计日志(auditd)
# 查看审计服务状态systemctl status auditd# 查看审计日志ausearch -m USER_LOGINausearch -m USER_AUTHausearch -m SYSCALLausearch -m FILE_ACCESS# 按时间搜索ausearch -ts todayausearch -ts recent# 按用户搜索ausearch -ua username# 按文件搜索ausearch -f /etc/passwdausearch -f /etc/shadow# 查看审计规则auditctl -l# 添加审计规则auditctl -w /etc/passwd -p wa -k passwd_changesauditctl -w /etc/shadow -p wa -k shadow_changes
8.3 文件完整性检查
# 检查关键文件修改find /etc -type f -mtime -1find /etc -type f -name "*.conf" -mtime -7# 检查 SUID 文件find / -type f -perm -4000 2>/dev/null# 检查 SGID 文件find / -type f -perm -2000 2>/dev/null# 检查异常文件find /tmp -type f -executablefind /var/tmp -type f -executable# 检查隐藏文件find / -name ".*" -type f 2>/dev/null | grep -v "/proc\|/sys"
8.4 进程安全检查
# 查看异常进程ps auxfps aux | grep -v "root\|mysql\|nginx\|www-data"# 查看隐藏进程ls -la /proc/ | grep -v "^d"# 查看网络连接异常进程netstat -tlnp | grep -v "root\|mysql\|nginx"lsof -i | grep -v "root\|mysql\|nginx"# 查看可疑 cron 任务cat /etc/crontabls -la /etc/cron.d/crontab -l# 检查启动项cat /etc/rc.localls -la /etc/init.d/systemctl list-unit-files --type=service
8.5 安全事件日志分析
# 查看 SELinux 日志grep "SELinux\|AVC" /var/log/messagesausearch -m avc# 查看 AppArmor 日志grep "apparmor\|denied" /var/log/syslog# 查看入侵检测日志cat /var/log/ossec.logtail -100f /var/log/fail2ban.log# 分析安全事件grep -E "Failed|Invalid|Denied|Blocked" /var/log/auth.log | tail -50
9. 自动化监控脚本
9.1 系统健康检查脚本
#!/bin/bash# 文件名:system_health_check.sh# 功能:系统健康检查LOG_FILE="/var/log/system_health.log"TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')echo "========== 系统健康检查 [$TIMESTAMP] ==========" >> $LOG_FILE# CPU 检查CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)echo "【CPU 使用率】${CPU_USAGE}%" >> $LOG_FILEif (( $(echo "$CPU_USAGE > 80" | bc -l) )); then echo "⚠️ 警告:CPU 使用率过高!" >> $LOG_FILEfi# 内存检查MEM_USAGE=$(free | grep Mem | awk '{printf("%.2f", $3/$2 * 100.0)}')echo "【内存使用率】${MEM_USAGE}%" >> $LOG_FILEif (( $(echo "$MEM_USAGE > 80" | bc -l) )); then echo "⚠️ 警告:内存使用率过高!" >> $LOG_FILEfi# 磁盘检查echo "【磁盘使用】" >> $LOG_FILEdf -h | grep -v "tmpfs\|udev" >> $LOG_FILEdf -h | grep -v "tmpfs\|udev" | awk 'NR>1 {gsub(/%/,"",$5); if($5 > 80) print "⚠️ 警告:" $6 " 使用率过高 (" $5 "%)"}' >> $LOG_FILE# 服务检查echo "【失败的服务】" >> $LOG_FILEsystemctl --failed --no-pager >> $LOG_FILE# 错误日志检查echo "【最近系统错误】" >> $LOG_FILEjournalctl -p err --since "1 hour ago" --no-pager | tail -10 >> $LOG_FILEecho "========== 检查完成 ==========" >> $LOG_FILEecho "" >> $LOG_FILE
9.2 日志错误监控脚本
#!/bin/bash# 文件名:log_error_monitor.sh# 功能:监控日志中的错误LOG_FILES=( "/var/log/messages" "/var/log/syslog" "/var/log/nginx/error.log" "/var/log/mysql/error.log")ERROR_PATTERNS=( "error" "Error" "ERROR" "critical" "Critical" "CRITICAL" "fatal" "Fatal" "FATAL" "panic" "Panic" "PANIC")OUTPUT_FILE="/var/log/error_monitor.log"TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')echo "========== 错误监控报告 [$TIMESTAMP] ==========" > $OUTPUT_FILEfor log_file in "${LOG_FILES[@]}"; do if [ -f "$log_file" ]; then echo "" >> $OUTPUT_FILE echo "【日志文件:$log_file】" >> $OUTPUT_FILE for pattern in "${ERROR_PATTERNS[@]}"; do count=$(grep -c "$pattern" "$log_file" 2>/dev/null || echo 0) if [ "$count" -gt 0 ]; then echo " $pattern: $count 次" >> $OUTPUT_FILE grep "$pattern" "$log_file" | tail -5 >> $OUTPUT_FILE fi done fidoneecho "" >> $OUTPUT_FILEecho "========== 监控完成 ==========" >> $OUTPUT_FILE
9.3 自动日志分析脚本
#!/bin/bash# 文件名:auto_log_analysis.sh# 功能:自动分析日志并生成报告REPORT_DIR="/var/log/reports"DATE=$(date '+%Y%m%d')mkdir -p $REPORT_DIR# Nginx 访问日志分析if [ -f "/var/log/nginx/access.log" ]; then echo "========== Nginx 访问分析 ==========" > $REPORT_DIR/nginx_report_$DATE.txt echo "【总请求数】" >> $REPORT_DIR/nginx_report_$DATE.txt wc -l < /var/log/nginx/access.log >> $REPORT_DIR/nginx_report_$DATE.txt echo "【状态码统计】" >> $REPORT_DIR/nginx_report_$DATE.txt awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -rn >> $REPORT_DIR/nginx_report_$DATE.txt echo "【Top 10 IP】" >> $REPORT_DIR/nginx_report_$DATE.txt awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10 >> $REPORT_DIR/nginx_report_$DATE.txt echo "【Top 10 URL】" >> $REPORT_DIR/nginx_report_$DATE.txt awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10 >> $REPORT_DIR/nginx_report_$DATE.txt echo "【4xx 错误】" >> $REPORT_DIR/nginx_report_$DATE.txt grep " 4[0-9][0-9] " /var/log/nginx/access.log | tail -20 >> $REPORT_DIR/nginx_report_$DATE.txt echo "【5xx 错误】" >> $REPORT_DIR/nginx_report_$DATE.txt grep " 5[0-9][0-9] " /var/log/nginx/access.log | tail -20 >> $REPORT_DIR/nginx_report_$DATE.txtfi# 系统日志分析if [ -f "/var/log/messages" ]; then echo "========== 系统日志分析 ==========" > $REPORT_DIR/system_report_$DATE.txt echo "【错误统计】" >> $REPORT_DIR/system_report_$DATE.txt grep -i "error" /var/log/messages | wc -l >> $REPORT_DIR/system_report_$DATE.txt echo "【警告统计】" >> $REPORT_DIR/system_report_$DATE.txt grep -i "warning" /var/log/messages | wc -l >> $REPORT_DIR/system_report_$DATE.txt echo "【最近错误】" >> $REPORT_DIR/system_report_$DATE.txt grep -i "error" /var/log/messages | tail -20 >> $REPORT_DIR/system_report_$DATE.txtfiecho "报告生成完成:$REPORT_DIR/"
9.4 定时任务配置
# 编辑 crontabcrontab -e# 每小时执行健康检查0 * * * * /usr/local/bin/system_health_check.sh# 每 5 分钟监控错误日志*/5 * * * * /usr/local/bin/log_error_monitor.sh# 每天生成日志分析报告0 2 * * * /usr/local/bin/auto_log_analysis.sh# 每周清理旧日志0 3 * * 0 find /var/log -name "*.log" -mtime +30 -delete0 3 * * 0 journalctl --vacuum-time=7d
10. 排障速查手册
10.1 故障排查流程
1. 收集信息 ├─ 故障现象是什么? ├─ 何时开始出现的? ├─ 影响范围多大? └─ 最近有什么变更?2. 查看日志 ├─ 系统日志:journalctl -p err --since "1 hour ago" ├─ 应用日志:tail -100f /var/log/app/error.log └─ 安全日志:grep "Failed" /var/log/auth.log3. 检查资源 ├─ CPU:top, htop ├─ 内存:free -h ├─ 磁盘:df -h └─ 网络:netstat -an4. 定位问题 ├─ 是资源问题? ├─ 是配置问题? ├─ 是代码问题? └─ 是外部依赖问题?5. 解决问题 ├─ 临时方案(重启、清理) └─ 永久方案(修复配置、代码)6. 验证与总结 ├─ 问题是否解决? ├─ 是否会再次发生? └─ 如何预防?
10.2 常用排障命令速查
| 场景 | 命令 |
|---|
| 查看系统日志 | journalctl -p err --since "1 hour ago" |
| 查看服务状态 | systemctl status <service> |
| 查看进程 | ps aux \| grep <name> |
| 查看端口 | netstat -tlnp \| grep <port> |
| 查看磁盘 | df -h |
| 查看内存 | free -h |
| 查看 CPU | top |
| 查看网络 | ip addr show |
| 测试连通性 | ping <host> |
| 测试端口 | nc -zv <host> <port> |
| 查看连接 | ss -an |
| 查看打开文件 | lsof -p <pid> |
| 查看 IO | iostat -x 1 |
| 查看日志文件 | tail -100f /var/log/xxx.log |
| 搜索日志 | grep "error" /var/log/xxx.log |
10.3 常见错误代码含义
HTTP 状态码
| 代码 | 含义 | 排查方向 |
|---|
| 200 | 成功 | - |
| 301 | 永久重定向 | 检查重定向配置 |
| 302 | 临时重定向 | 检查重定向配置 |
| 400 | 请求错误 | 检查请求格式 |
| 401 | 未授权 | 检查认证配置 |
| 403 | 禁止访问 | 检查权限配置 |
| 404 | 未找到 | 检查文件路径 |
| 408 | 请求超时 | 检查网络/服务器负载 |
| 429 | 请求过多 | 检查限流配置 |
| 500 | 服务器错误 | 查看应用日志 |
| 502 | 网关错误 | 检查上游服务 |
| 503 | 服务不可用 | 检查服务状态 |
| 504 | 网关超时 | 检查上游服务响应 |
系统错误码
| 错误码 | 含义 | 排查方向 |
|---|
| ENOENT (2) | 文件不存在 | 检查文件路径 |
| EACCES (13) | 权限拒绝 | 检查文件权限 |
| ENOMEM (12) | 内存不足 | 检查内存使用 |
| ENOSPC (28) | 磁盘空间不足 | 检查磁盘空间 |
| ECONNREFUSED (111) | 连接被拒绝 | 检查服务状态 |
| ETIMEDOUT (110) | 连接超时 | 检查网络/防火墙 |
10.4 紧急排障清单
# 1. 系统是否响应?ping localhostssh localhost# 2. 关键服务是否正常?systemctl --failed# 3. 资源是否充足?df -hfree -htop -bn1 | head -5# 4. 是否有严重错误?journalctl -p crit --since "1 hour ago"dmesg | grep -i "panic\|error\|fail"# 5. 网络是否正常?ip addr shownetstat -tlnpping 8.8.8.8# 6. 是否有安全事件?grep "Failed" /var/log/auth.log | tail -10last | head -10# 7. 日志是否异常增长?ls -lh /var/log/du -sh /var/log/*
10.5 日志文件快速定位
# 查找最近的日志文件find /var/log -type f -mmin -60# 查找最大的日志文件find /var/log -type f -exec ls -lh {} \; | sort -k5 -rn | head -10# 查找包含特定内容的日志grep -rl "error" /var/log/# 查看日志文件数量find /var/log -type f | wc -l# 查看日志总大小du -sh /var/log/