install
source · Clone the upstream repo
git clone https://github.com/chaterm/terminal-skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/chaterm/terminal-skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/server/log-analysis" ~/.claude/skills/chaterm-terminal-skills-log-analysis && rm -rf "$T"
manifest:
server/log-analysis/SKILL.mdsource content
日志分析与处理
概述
日志聚合、分析工具、告警配置等技能。
日志查看
基础命令
# 实时查看 tail -f /var/log/syslog tail -f /var/log/nginx/access.log # 多文件同时查看 tail -f /var/log/nginx/*.log multitail /var/log/nginx/access.log /var/log/nginx/error.log # 查看最后N行 tail -n 100 /var/log/syslog # 查看开头 head -n 100 /var/log/syslog # 分页查看 less /var/log/syslog less +F /var/log/syslog # 类似 tail -f
按时间过滤
# 使用 sed 按时间范围 sed -n '/2024-01-15 10:00/,/2024-01-15 11:00/p' /var/log/app.log # 使用 awk awk '/2024-01-15 10:/ && /2024-01-15 11:/' /var/log/app.log # 使用 journalctl journalctl --since "2024-01-15 10:00" --until "2024-01-15 11:00" journalctl --since "1 hour ago" journalctl --since today
文本搜索
grep
# 基础搜索 grep "error" /var/log/syslog grep -i "error" /var/log/syslog # 忽略大小写 grep -r "error" /var/log/ # 递归搜索 # 正则表达式 grep -E "error|warning" /var/log/syslog grep -P "\d{4}-\d{2}-\d{2}" /var/log/syslog # Perl 正则 # 上下文 grep -A 3 "error" /var/log/syslog # 后3行 grep -B 3 "error" /var/log/syslog # 前3行 grep -C 3 "error" /var/log/syslog # 前后3行 # 统计 grep -c "error" /var/log/syslog # 计数 grep -l "error" /var/log/*.log # 只显示文件名 # 排除 grep -v "debug" /var/log/syslog # 排除包含 debug 的行
ripgrep (rg)
# 更快的搜索 rg "error" /var/log/ rg -i "error" /var/log/ # 忽略大小写 rg -C 3 "error" /var/log/ # 上下文 rg --type log "error" # 按文件类型
文本处理
awk
# 打印特定列 awk '{print $1, $4}' /var/log/nginx/access.log # 条件过滤 awk '$9 == 500' /var/log/nginx/access.log awk '$9 >= 400 && $9 < 500' /var/log/nginx/access.log # 统计 awk '{sum += $10} END {print sum}' /var/log/nginx/access.log awk '{count[$9]++} END {for (c in count) print c, count[c]}' /var/log/nginx/access.log # 自定义分隔符 awk -F: '{print $1}' /etc/passwd awk -F'[ :]' '{print $1, $2}' /var/log/syslog
sed
# 替换 sed 's/old/new/g' file.log sed -i 's/old/new/g' file.log # 原地修改 # 删除行 sed '/pattern/d' file.log sed '1,10d' file.log # 删除前10行 # 提取行 sed -n '10,20p' file.log # 打印10-20行 sed -n '/start/,/end/p' file.log # 打印匹配范围
sort & uniq
# 排序 sort file.log sort -r file.log # 逆序 sort -n file.log # 数字排序 sort -k2 file.log # 按第2列排序 # 去重统计 sort file.log | uniq sort file.log | uniq -c # 计数 sort file.log | uniq -c | sort -rn # 按频率排序
Nginx 日志分析
常用分析
# 访问量统计 wc -l /var/log/nginx/access.log # IP 访问排行 awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -20 # 状态码统计 awk '{print $9}' access.log | sort | uniq -c | sort -rn # URL 访问排行 awk '{print $7}' access.log | sort | uniq -c | sort -rn | head -20 # 每小时访问量 awk '{print substr($4,14,2)}' access.log | sort | uniq -c # 慢请求(响应时间 > 1s) awk '$NF > 1' access.log | head -20 # 404 错误 awk '$9 == 404 {print $7}' access.log | sort | uniq -c | sort -rn # 带宽统计 awk '{sum += $10} END {print sum/1024/1024 " MB"}' access.log
GoAccess 实时分析
# 安装 apt install goaccess # 实时分析 goaccess /var/log/nginx/access.log -c # 生成 HTML 报告 goaccess /var/log/nginx/access.log -o report.html --log-format=COMBINED # 实时 HTML goaccess /var/log/nginx/access.log -o /var/www/html/report.html --real-time-html
日志轮转
logrotate 配置
# /etc/logrotate.d/myapp /var/log/myapp/*.log { daily # 每天轮转 rotate 7 # 保留7个 compress # 压缩 delaycompress # 延迟压缩 missingok # 文件不存在不报错 notifempty # 空文件不轮转 create 0640 www-data www-data # 创建新文件 sharedscripts postrotate systemctl reload nginx > /dev/null 2>&1 || true endscript }
手动轮转
# 测试配置 logrotate -d /etc/logrotate.d/myapp # 强制轮转 logrotate -f /etc/logrotate.d/myapp
常见场景
场景 1:错误日志分析
# 统计错误类型 grep -E "ERROR|WARN|FATAL" /var/log/app.log | \ awk '{print $3}' | sort | uniq -c | sort -rn # 最近1小时的错误 awk -v date="$(date -d '1 hour ago' '+%Y-%m-%d %H')" \ '$0 ~ date && /ERROR/' /var/log/app.log
场景 2:性能分析
# 响应时间分布 awk '{print int($NF)}' access.log | sort -n | uniq -c | \ awk '{printf "%ds: %d\n", $2, $1}' # 慢请求 Top 10 awk '{print $NF, $7}' access.log | sort -rn | head -10
场景 3:安全分析
# 失败登录尝试 grep "Failed password" /var/log/auth.log | \ awk '{print $(NF-3)}' | sort | uniq -c | sort -rn # 可疑 IP awk '$9 ~ /4[0-9][0-9]/ {print $1}' access.log | \ sort | uniq -c | sort -rn | head -20
故障排查
| 问题 | 排查方法 |
|---|---|
| 日志太大 | 配置 logrotate、按时间过滤 |
| 搜索慢 | 使用 ripgrep、建立索引 |
| 格式不统一 | 使用 awk 自定义解析 |
| 实时监控 | tail -f、GoAccess |
| 历史分析 | ELK Stack、Loki |