grep - 文本搜索
grep "ERROR" app.log
grep -A 3 -B 2 "Exception" app.log # 显示匹配行前后内容
awk - 文本处理
awk '/ERROR/{print $5}' app.log | sort | uniq -c | sort -nr
sed - 流编辑器
sed -n '/2023-10-01 14:00/,/2023-10-01 15:00/p' app.log
logrotate - 日志轮转
# 配置示例 /etc/logrotate.d/myapp
/var/log/myapp/*.log {
daily
rotate 7
compress
missingok
notifempty
create 644 root root
}
journalctl - systemd日志
journalctl -u nginx --since "1 hour ago"
journalctl -u myapp -f # 实时跟踪
GoAccess - Web日志分析
goaccess access.log -a -o report.html
cat app.log | grep -oP 'ERROR.*' | sort | uniq -c | sort -nr | head -20
awk '/Response time:/{print $NF}' app.log | sort -n | \
awk '{arr[NR]=$1} END {print "Min:", arr[1], "Max:", arr[NR], "Median:", arr[int(NR/2)]}'
grep "ERROR" app.log | awk '{print $1, $2}' | uniq -c
json
{"timestamp":"2023-10-01T14:00:00Z","level":"ERROR","message":"DB connection failed","service":"api","duration_ms":45}
# 使用tail和grep实时监控错误
tail -f app.log | grep --line-buffered "ERROR\|WARN\|Exception"
# 使用multitail同时监控多个日志
multitail -i /var/log/nginx/access.log -i /var/log/nginx/error.log
对于高流量应用,考虑采样日志:
# 每100条记录1条
awk 'BEGIN {srand()} !/ERROR/ && rand() <= 0.01 {print}' app.log
# 使用zstd高效压缩日志
find /var/log/myapp -name "*.log" -mtime +7 -exec zstd --rm {} \;
通过合理使用这些工具和策略,您可以有效地分析应用程序日志,识别性能瓶颈,并优化日志记录实践。