菜鸟科技网

日志分析常用命令有哪些?

日志分析是系统运维、安全监控和问题排查的核心工作,通过高效命令快速定位问题、提取关键信息至关重要,以下是日志分析中常用的命令及其实际应用场景,结合Linux环境进行详细说明。

日志分析常用命令有哪些?-图1
(图片来源网络,侵删)

基础过滤与查看命令

  1. grep:最常用的文本过滤工具,支持正则表达式,用于匹配包含特定关键词的行。

    • 基础用法:grep "error" /var/log/nginx/error.log(查找包含“error”的行)。
    • 进阶选项:
      • -i:忽略大小写,如grep -i "WARNING" app.log
      • -v:反向匹配,如grep -v "INFO" system.log(排除INFO级别日志)。
      • -c:统计匹配行数,如grep -c "failed" auth.log
      • -A 3 -B 3:显示匹配行前后3行上下文,便于定位问题根源,如grep -A 5 -B 5 "timeout" service.log
  2. catmore/less:用于查看文件内容,但更适合小文件。

    • cat /var/log/syslog:直接输出全部内容,适合小日志文件。
    • less /var/log/app.log:分页查看,支持上下滚动、关键词搜索(输入),适合大文件交互式浏览。
  3. tail:实时监控日志末尾内容,是排查实时问题的利器。

    • tail -f /var/log/mysql/error.log:实时追加显示新日志,Ctrl+C退出。
    • tail -n 100 access.log:显示文件最后100行,结合-f可实时跟踪最新100行变化。

高级搜索与统计命令

  1. awk:强大的文本处理工具,按列提取和计算数据。

    日志分析常用命令有哪些?-图2
    (图片来源网络,侵删)
    • 提取特定列:awk '{print $1, $4}' access.log(打印日志的第1、4列,如IP和请求时间)。
    • 按条件统计:awk '$7 == "404" {count++} END {print "404错误次数:", count}' access.log(统计404错误次数)。
    • 自定义分隔符:awk -F"|" '{print $2}' custom.log(以“|”为分隔符提取第二字段)。
  2. sed:流编辑器,用于文本替换、删除或插入。

    • 替换文本:sed 's/old_ip/new_ip/g' config.log(全局替换“old_ip”为“new_ip”)。
    • 删除匹配行:sed '/^#/d' config.log(删除以“#”开头的注释行)。
    • 提取特定行:sed -n '10,20p' app.log(打印第10至20行)。
  3. sort:对文本行排序,常与uniq结合使用。

    • 基础排序:sort access.log | uniq -c(按行排序后统计重复次数,可分析高频访问IP)。
    • 数值排序:sort -n numbers.log(对数字按大小排序,如响应时间统计)。
    • 去重:sort -u access.log | head -10(排序后去重,显示前10条唯一访问记录)。

日志聚合与时间范围过滤

  1. date结合grep:按时间范围过滤日志。

    • 示例:grep "$(date '+%Y-%m-%d') 10:00" app.log(筛选当天10:00的日志)。
    • 更精确范围:sed -n '/2023-10-01 10:00/,/2023-10-01 11:00/p' app.log(提取指定时间段日志)。
  2. jq:处理JSON格式日志(如ELK栈、应用日志)。

    日志分析常用命令有哪些?-图3
    (图片来源网络,侵删)
    • 提取字段:jq '.timestamp, .level' app.json.log(输出时间戳和日志级别)。
    • 过滤条件:jq 'select(.level == "ERROR")' app.json.log(筛选ERROR级别的JSON日志)。

日志分析常用命令组合示例

以下表格总结了常见场景的命令组合:

场景 命令示例 说明
统计高频错误关键词 grep "ERROR" app.log | awk '{print $5}' | sort | uniq -c | sort -nr 提取错误关键词并按频率降序排序
分析Top 10访问IP awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -10 统计访问量最高的前10个IP地址
过滤特定时间段的日志 sed -n '/2023-10-01 09:00/,/2023-10-01 10:00/p' app.log 提取2023年10月1日9:00-10:00的日志段
合并多个日志文件 cat log1.log log2.log > combined.log 将多个日志文件合并为一个大文件

FAQs

Q1: 如何快速定位日志中的慢查询SQL?
A1: 假设MySQL慢查询日志格式为# Time: 2023-10-01 10:00:00, 可通过以下命令提取:
grep "Query_time" slow.log | awk '{print $2}' | sort -n | tail -5
该命令提取查询时间字段,按数值排序后显示最慢的5条SQL的执行时间,若需完整SQL语句,可使用:
grep -A 20 "Query_time: [0-9.]\{5,\}" slow.log(显示查询时间超过5秒的SQL及其上下文)。

Q2: 日志文件过大时,如何高效分析而不卡顿?
A2: 可采用以下方法优化:

  1. 分块处理:使用split -l 1000000 large.log part_将大文件分割为每行100万的小文件,再逐个分析。
  2. 内存映射工具lessvim大文件时,使用vim -R large.log(只读模式)避免加载到内存。
  3. 专用工具:对于结构化日志,使用ripgreprg)替代grep,其速度更快且支持正则表达式,rg "error" -n /var/log/app.log
  4. 采样分析awk 'NR % 10 == 0' large.log(每10行取1行)快速预览日志分布情况。
分享:
扫描分享到社交APP
上一篇
下一篇