Skip to content
Skillv1.0.0

log-analysis

日志分析与处理

by chaterm(0) 0 installs
Free
Sign in to install

Free account. Installing gives you the manifest plus copy-paste snippets.

See reviews

About

Imported from chaterm/terminal-skills (server/log-analysis/SKILL.md). Install upstream with npx skills add chaterm/terminal-skills --skill log-analysis. Copyright stays with the author.

日志分析与处理

概述

日志聚合、分析工具、告警配置等技能。

日志查看

基础命令

# 实时查看
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

Use it

Copy one of these into your project. Installing also returns the manifest and these snippets.

yaml
targets:
  - https://api.opensmartroute.ai/api/v1/registry/chaterm-terminal-skills-log-analysis/manifest   # or paste the manifest below

Manifest

An Open Capability Manifest: the router reads it to know what this does, what it costs and when to pick it.

chaterm-terminal-skills-log-analysis.ocm.jsonjson
{
  "ocm": "1",
  "id": "chaterm-terminal-skills-log-analysis",
  "kind": "skill",
  "name": "log-analysis",
  "description": "日志分析与处理",
  "publisher": "chaterm",
  "version": "1.0.0",
  "capabilities": {
    "domains": [
      "general"
    ],
    "tags": [
      "skill-md",
      "server",
      "log",
      "analysis",
      "grep",
      "awk",
      "monitoring",
      "skills-sh"
    ],
    "languages": [
      "en"
    ]
  },
  "quality_prior": 0.6,
  "examples": [
    "日志分析与处理"
  ],
  "primary": false,
  "metadata": {
    "source": {
      "provider": "skills.sh",
      "repository": "https://github.com/chaterm/terminal-skills",
      "path": "server/log-analysis/SKILL.md",
      "ref": "HEAD",
      "url": "https://github.com/chaterm/terminal-skills/blob/HEAD/server/log-analysis/SKILL.md",
      "key": "chaterm/terminal-skills/server/log-analysis/SKILL.md"
    }
  },
  "instructions": "# 日志分析与处理\n\n## 概述\n日志聚合、分析工具、告警配置等技能。\n\n## 日志查看\n\n### 基础命令\n```bash\n# 实时查看\ntail -f /var/log/syslog\ntail -f /var/log/nginx/access.log\n\n# 多文件同时查看\ntail -f /var/log/nginx/*.log\nmultitail /var/log/nginx/access.log /var/log/nginx/error.log\n\n# 查看最后N行\ntail -n 100 /var/log/syslog\n\n# 查看开头\nhead -n 100 /var/log/syslog\n\n# 分页查看\nless /var/log/syslog\nless +F /var/log/syslog             # 类似 tail -f\n```\n\n### 按时间过滤\n```bash\n# 使用 sed 按时间范围\nsed -n '/2024-01-15 10:00/,/2024-01-15 11:00/p' /var/log/app.log\n\n# 使用 awk\nawk '/2024-01-15 10:/ && /2024-01-15 11:/' /var/log/app.log\n\n# 使用 journalctl\njournalctl --since \"2024-01-1",
  "cost": {
    "context_tokens": 1187
  }
}

Fetch it by URL: GET /api/v1/registry/chaterm-terminal-skills-log-analysis/manifest?version=1.0.0

Reviews

Star ratings from people who tried it. One review per account; edit yours any time.

No reviews yet. Install it, try it, and be the first to rate it.