排查linux日志需精准筛选时间、组合关键字、实时追踪与结构化分析:用sed/awk/journalctl截取时段,grep组合错误词并排除干扰,tail -f实时过滤,awk/dmesg提取关键字段。

排查Linux问题,日志是第一手线索。关键不在“看全”,而在“看准”——用对命令、选对关键字、缩小范围,5分钟内锁定异常源头。
精准筛选时间范围:避免大海捞针
线上故障常集中在某几分钟,盲目翻全量日志效率极低。用 sed 或 awk 截取关键时段最直接:
-
按时间截取(例如查今天14:20–14:25的日志):
sed -n '/14:20:/, /14:25:/p' /var/log/syslog -
用 awk 匹配更精确(支持秒级、多条件):
awk '$0 ~ /14:2[0-5]:[0-5][0-9]/ {print}' /var/log/messages -
结合 journalctl 查指定时间段(systemd 系统推荐):
journalctl --since "2024-06-10 14:20:00" --until "2024-06-10 14:25:00"
关键字组合搜索:避开干扰,直击异常
单搜 “error” 会命中大量无害提示;要结合上下文和严重等级:
-
排除调试/信息类日志,聚焦真实错误:
grep -i "error\|fail\|panic\|segfault" /var/log/secure | grep -v -i "debug\|info\|successfully" -
关联进程或服务名(如 sshd、nginx、java):
grep -A 2 -B 1 "Connection refused" /var/log/nginx/error.log(-A 2 -B 1显示匹配行后2行、前1行,看堆栈或请求上下文) -
正则进阶:匹配带IP或PID的异常行:
grep -E "(192\.168\.|pid \[[0-9]+\]) .* (refused|timeout|denied)" /var/log/auth.log
实时追踪 + 动态过滤:边发生边分析
问题正在发生?别等日志写完再查,用 tail -f 搭配 grep 实时捕获:
-
只看含关键词的新日志(不刷屏无关内容):
tail -f /var/log/kern.log | grep -i "oom\|killed process" -
多个关键字任一匹配,且高亮显示:
tail -f /var/log/syslog | grep --color=always -i "disk full\|no space\|inode" -
配合 stdbuf 避免缓冲延迟(尤其管道中):
stdbuf -oL tail -f /var/log/myapp.log | grep "Exception"
日志结构化处理:从文本到线索
原始日志杂乱?用简单工具提取关键字段,快速定位规律:
-
统计高频错误IP(适用于 access.log 或 auth.log):
awk '{print $1}' /var/log/apache2/access.log | sort | uniq -c | sort -nr | head -10 -
查看最近10个崩溃进程(匹配 kernel 日志中的 “killed process”):
dmesg -T | grep "killed process" | tail -10 | awk -F'[(]|[)]' '{print $2,$NF}' -
把时间+错误+服务三列对齐,便于人工扫描:
grep -i "error\|fail" /var/log/syslog | awk '{print $1,$2,$3,$5,$NF}' | column -t











