在Linux系统中,日志解析和提取是日常运维和故障排查的重要工作。以下是几种高效处理日志的常用方法及工具组合:
grep - 关键词过滤
# 查找包含"ERROR"的行(区分大小写)
grep "ERROR" /var/log/syslog
# 忽略大小写并显示前后3行
grep -i -A3 -B3 "error" application.log
awk - 字段提取
# 提取nginx日志中状态码为500的请求
awk '$9 == 500 {print $7}' /var/log/nginx/access.log
# 统计不同状态码出现次数
awk '{print $9}' access.log | sort | uniq -c
sed - 流编辑
# 替换日志中的IP为[ANONYMIZED]
sed -E 's/([0-9]{1,3}\.){3}[0-9]{1,3}/[ANONYMIZED]/g' auth.log
# 提取特定时间段的日志(04:00到04:30)
sed -n '/^May 10 04:00/,/^May 10 04:30/p' system.log
journalctl - 系统日志查询
# 查看最近10条内核日志
journalctl -k -n 10
# 显示特定服务的日志(带时间范围)
journalctl -u nginx --since "2023-05-01" --until "2023-05-02"
logrotate - 日志轮转
# 手动执行日志轮转(需提前配置/etc/logrotate.conf)
logrotate -vf /etc/logrotate.d/nginx
multitail - 多文件实时监控
# 同时监控多个日志文件(需安装)
multitail -i /var/log/nginx/access.log -i /var/log/nginx/error.log
jq - JSON日志解析
# 提取JSON日志中的特定字段
cat app.log | jq '.timestamp, .error.message'
# 过滤并格式化输出
cat api.log | jq 'select(.response_code >= 400) | {time: .timestamp, url: .request.url}'
csvkit - CSV日志分析
# 统计CSV格式日志的列信息(需安装csvkit)
csvstat application.csv
# 使用awk提取特定时间段(04:00:00到04:30:00)
awk '/May 10 04:00:00/,/May 10 04:30:00/' /var/log/syslog
# 使用perl兼容正则(更精确的时间匹配)
grep -P '^May 10 04:[0-2][0-9]:[0-5][0-9]' auth.log
使用LC_ALL加速处理
# 设置C语言区域提升处理速度
LC_ALL=C grep "pattern" huge.log
并行处理大文件
# 使用GNU parallel分割处理(需安装)
cat bigfile.log | parallel --pipe --block 10M "grep 'ERROR'"
文本统计
# 生成访问量TOP 10 URL
awk '{print $7}' access.log | sort | uniq -c | sort -nr | head -10
生成简单图表
# 生成状态码分布柱状图
awk '{print $9}' access.log | sort | uniq -c | gnuplot -p -e 'plot "-" using 2:1 with boxes'
对于分布式系统,建议使用: - ELK Stack (Elasticsearch + Logstash + Kibana) - Grafana Loki - Fluentd
# 1. 提取500错误
awk '$9 == 500 {print $7,$1}' /var/log/nginx/access.log > 500_errors.txt
# 2. 统计错误URL频次
cut -d' ' -f1 500_errors.txt | sort | uniq -c | sort -nr
# 3. 分析客户端IP分布
cut -d' ' -f2 500_errors.txt | sort | uniq -c | sort -nr | head -5
掌握这些工具组合后,您可以高效处理GB级别的日志文件。对于更复杂的场景,建议考虑使用专门的日志分析平台。