百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分析 > 正文

Linux 下用 awk 分析日志文件实例

liebian365 2025-01-12 16:19 18 浏览 0 评论

关于 awk

awk 命令比较复杂,不过不要怕,这里不讲它那些复杂的参数,实际上我自己也只记得少数几个参数而已。。。

先简单的描述其作用如下

  • 对目标文件逐行分析
  • 对每一行的数据,默认以空格作为分隔符将其划分成多个域(或曰字段),并用 $n 来引用划分后的数据,其中 $0 表示原始的整行数据,而 $1 则表示划分出来的第一个域,依次类推
    • 当然你也可以自定义分隔符,这个属于进阶知识,暂时先放下不表
  • awk 有简单的编程能力,你写的代码需要用 '{}' 包围起来,在花括号里面写代码,作为程序员写 awk 的代码是很简单的,这里我们不打算讲 awk 的语法,一般常用的是
    • if 条件判断
    • print 打印输出

我们的日志文件,基本上每一行的格式都是固定的,所以就很适合用 awk 来分析了,接下来用一个稍有点复杂的案例来讲解下

目标

通过分析业务系统的 error.log 日志,统计出有哪些异常及其数量

分析

首先要看下异常日志的格式

2020-07-19 01:03:41,399 ERROR [qtp738355611-33898] [AppInfoController] - appUpdate:
java.lang.NumberFormatException: !hex 215
        at org.eclipse.jetty.util.TypeUtil.convertHexDigit(TypeUtil.java:375)
        at org.eclipse.jetty.util.UrlEncoded.decodeUtf8To(UrlEncoded.java:545)
        at org.eclipse.jetty.util.UrlEncoded.decodeTo(UrlEncoded.java:601)
        at org.eclipse.jetty.server.Request.extractParameters(Request.java:298)
        at org.eclipse.jetty.server.Request.getParameter(Request.java:708)
        at com.meizu.apkfilemanage.common.util.BuildBeanUtil.buildAppUpdate(BuildBeanUtil.java:905)
        at com.meizu.apkfilemanage.web.AppInfoController.appUpdate(AppInfoController.java:204)
        at sun.reflect.GeneratedMethodAccessor132.invoke(Unknown Source)

经过分析,发现每次打印异常的格式如下

  • 第一行:时间,日志级别,线程信息,类,异常消息(业务)
  • 第二行及后续:异常堆栈信息,其中第二行是异常的类名及异常消息

那么我们的思路是

  1. 找到有第三个域为 ERROR 的那一行
  2. 该行的下一行就是我们需要统计分析的那一行

命令

注意:该命令在 Linux 命令行下应该在同一行,这里为了排版需要,分成了多行

zcat error.log.20200719.gz | 
    awk -v line=0 '{if (line==1) print($0); if ($3=="ERROR") {line=1;} else {line=0;}}' | 
    sort | uniq -c | sort -rn

命令执行结果如下

     54 redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
     54 org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:
     28 org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: org.eclipse.jetty.io.EofException; nested exception is com.google.gson.JsonIOException: org.eclipse.jetty.io.EofException
     12 org.springframework.dao.DeadlockLoserDataAccessException:
      8 org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is java.sql.SQLException: An attempt by a client to checkout a Connection has timed out.
      7 java.lang.IllegalArgumentException: fromIndex(150) > toIndex(127)
      6 redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: Read timed out
      4 org.springframework.dao.DataIntegrityViolationException:
      4 java.lang.IllegalStateException: Optional long parameter 'timestamp' is present but cannot be translated into a null value due to being declared as a primitive type. Consider declaring it as object wrapper for the corresponding primitive type.
      3 org.eclipse.jetty.io.EofException
      3 java.lang.NullPointerException
      3 java.lang.IllegalArgumentException: fromIndex(150) > toIndex(131)
      3 com.alibaba.fastjson.JSONException: syntax error, pos 720
      1 org.springframework.dao.CannotAcquireLockException:
      1 java.lang.NumberFormatException: !hex 71
      1 java.lang.NumberFormatException: !hex 34
      1 java.lang.NumberFormatException: !hex 215
      1 java.lang.NumberFormatException: !hex 15
      1 com.alibaba.fastjson.JSONException: unclosed string : ?
      1 com.alibaba.fastjson.JSONException: unclosed string : ?
      1 com.alibaba.fastjson.JSONException: syntax error, unexpect token error
      1 com.alibaba.fastjson.JSONException: not match ':' - ,
      1 com.alibaba.fastjson.JSONException: error parse false

命令解析

zcat

和 cat 命令类似,不过作用的对象是压缩文件,将文件内容直接输出

|

这是 linux 管道符,他的作用是把管道符左边命令的输出当作管道符右边命令的输入,示例

ps aux | grep 'java'

awk

  • -v :我们定义了一个变量 line,其初始值为 0,如果为 1 就表示当前行是异常堆栈的第一行,我们要将该行输出供后续统计
awk -v line=0 '{if (line==1) print($0); if($3=="ERROR") {line=1;} else {line=0;}}'

我们知道,awk 命令会对输入的文本逐行进行处理,类似以下的处理过程

while 当前行不为空
    处理 当前行
    移动到 下一行

那么上面的命令就可以这样理解

# line 自定义变量,指示当前行是否包含异常信息 
line = 0
while 当前行不为空
    if line == 1 
        输出当前行
    if $3 == 'ERROR'
        line = 1
    else
        line = 0

这段代码的作用就是找到含有 ERROR 的行,并将其下一行打印输出

sort

以行为单位对文本进行排序,如果要做统计,必须先排序,后续才能使用 uniq 的去重统计功能

uniq

删除重复的行,参数

  • -c 在输出行前面加上每行在输入文件中出现的次数。
  • -d 仅显示重复行。
  • -u 仅显示不重复的行

一些常用的 awk 命令

统计各个接口的 pv

分析 nginx 的 access 日志文件,假定你的日志格式里,请求 uri 是在第 14 个域

awk '{print $14}}' xxx_access.log | sort | uniq -c | sort -rn | head -n 20

统计慢接口

假定你的日志文件里,http 响应时间在第9个域,那么要统计响应时间超过 1 秒的接口数量

awk '{if($9>1)print $0}' | wc -l

如果想要输出具体是哪些接口,可以结合上面命令

awk '{if($9>1)print $0}'|awk '{print $14}' |sort|uniq -c|sort -rn|head -n 20

如果要分时段统计慢接口

  • -F :自定义分隔符,因为时间是用 : 分隔的,所以经过 awk 分隔后第一个域就是小时数了
awk '{if($9>1)print $1}'|awk -F ':' '{print $1}'|uniq -c

统计各响应码

假定你的日志文件里 http 响应码是第二个域

awk '{print $2}'| sort | uniq -c | sort -rn

相关推荐

4万多吨豪华游轮遇险 竟是因为这个原因……

(观察者网讯)4.7万吨豪华游轮搁浅,竟是因为油量太低?据观察者网此前报道,挪威游轮“维京天空”号上周六(23日)在挪威近海发生引擎故障搁浅。船上载有1300多人,其中28人受伤住院。经过数天的调...

“菜鸟黑客”必用兵器之“渗透测试篇二”

"菜鸟黑客"必用兵器之"渗透测试篇二"上篇文章主要针对伙伴们对"渗透测试"应该如何学习?"渗透测试"的基本流程?本篇文章继续上次的分享,接着介绍一下黑客们常用的渗透测试工具有哪些?以及用实验环境让大家...

科幻春晚丨《震动羽翼说“Hello”》两万年星间飞行,探测器对地球的最终告白

作者|藤井太洋译者|祝力新【编者按】2021年科幻春晚的最后一篇小说,来自大家喜爱的日本科幻作家藤井太洋。小说将视角放在一颗太空探测器上,延续了他一贯的浪漫风格。...

麦子陪你做作业(二):KEGG通路数据库的正确打开姿势

作者:麦子KEGG是通路数据库中最庞大的,涵盖基因组网络信息,主要注释基因的功能和调控关系。当我们选到了合适的候选分子,单变量研究也已做完,接着研究机制的时便可使用到它。你需要了解你的分子目前已有哪些...

知存科技王绍迪:突破存储墙瓶颈,详解存算一体架构优势

智东西(公众号:zhidxcom)编辑|韦世玮智东西6月5日消息,近日,在落幕不久的GTIC2021嵌入式AI创新峰会上,知存科技CEO王绍迪博士以《存算一体AI芯片:AIoT设备的算力新选择》...

每日新闻播报(September 14)_每日新闻播报英文

AnOscarstatuestandscoveredwithplasticduringpreparationsleadinguptothe87thAcademyAward...

香港新巴城巴开放实时到站数据 供科技界研发使用

中新网3月22日电据香港《明报》报道,香港特区政府致力推动智慧城市,鼓励公私营机构开放数据,以便科技界研发使用。香港运输署21日与新巴及城巴(两巴)公司签署谅解备忘录,两巴将于2019年第3季度,开...

5款不容错过的APP: Red Bull Alert,Flipagram,WifiMapper

本周有不少非常出色的app推出,鸵鸟电台做了一个小合集。亮相本周榜单的有WifiMapper's安卓版的app,其中包含了RedBull的一款新型闹钟,还有一款可爱的怪物主题益智游戏。一起来看看我...

Qt动画效果展示_qt显示图片

今天在这篇博文中,主要实践Qt动画,做一个实例来讲解Qt动画使用,其界面如下图所示(由于没有录制为gif动画图片,所以请各位下载查看效果):该程序使用应用程序单窗口,主窗口继承于QMainWindow...

如何从0到1设计实现一门自己的脚本语言

作者:dong...

三年级语文上册 仿写句子 需要的直接下载打印吧

描写秋天的好句好段1.秋天来了,山野变成了美丽的图画。苹果露出红红的脸庞,梨树挂起金黄的灯笼,高粱举起了燃烧的火把。大雁在天空一会儿写“人”字,一会儿写“一”字。2.花园里,菊花争奇斗艳,红的似火,粉...

C++|那些一看就很简洁、优雅、经典的小代码段

目录0等概率随机洗牌:1大小写转换2字符串复制...

二年级上册语文必考句子仿写,家长打印,孩子照着练

二年级上册语文必考句子仿写,家长打印,孩子照着练。具体如下:...

一年级语文上 句子专项练习(可打印)

...

亲自上阵!C++ 大佬深度“剧透”:C++26 将如何在代码生成上对抗 Rust?

...

取消回复欢迎 发表评论: