Linux 下用 awk 分析日志文件实例
off999 2025-01-21 20:36 44 浏览 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)
经过分析,发现每次打印异常的格式如下
- 第一行:时间,日志级别,线程信息,类,异常消息(业务)
- 第二行及后续:异常堆栈信息,其中第二行是异常的类名及异常消息
那么我们的思路是
- 找到有第三个域为 ERROR 的那一行
- 该行的下一行就是我们需要统计分析的那一行
命令
注意:该命令在 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
- 上一篇:只需要一篇文章读透nginx源码
- 下一篇:云舟观测:Arkit数据解析插件详解
相关推荐
- 推荐一款Python的GUI可视化工具(python 可视化工具)
-
在Python基础语法学习完成后,进一步开发应用界面时,就需要涉及到GUI了,GUI全称是图形用户界面(GraphicalUserInterface,又称图形用户接口),采用图形方式显示的计算机操...
- 教你用Python绘制谷歌浏览器的3种图标
-
前两天在浏览matplotlib官方网站时,笔者无意中看到一个挺有意思的图片,就是用matplotlib制作的火狐浏览器的logo,也就是下面这个东东(网页地址是https://matplotlib....
- 小白学Python笔记:第二章 Python安装
-
Windows操作系统的python安装:Python提供Windows、Linux/UNIX、macOS及其他操作系统的安装包版本,结合自己的使用情况,此处仅记录windows操作系统的python...
- Python程序开发之简单小程序实例(9)利用Canvas绘制图形和文字
-
Python程序开发之简单小程序实例(9)利用Canvas绘制图形和文字一、项目功能利用Tkinter组件中的Canvas绘制图形和文字。二、项目分析要在窗体中绘制图形和文字,需先导入Tkinter组...
- 一文吃透Python虚拟环境(python虚拟环境安装和配置)
-
摘要在Python开发中,虚拟环境是一种重要的工具,用于隔离不同项目的依赖关系和环境配置。本文将基于windows平台介绍四种常用的Python虚拟环境创建工具:venv、virtualenv、pip...
- 小白也可以玩的Python爬虫库,收藏一下
-
最近,微软开源了一个项目叫「playwright-python」,作为一个兴起项目,出现后受到了大家热烈的欢迎,那它到底是什么样的存在呢?今天为你介绍一下这个传说中的小白神器。Playwright是...
- python环境安装+配置教程(python安装后怎么配置环境变量)
-
安装python双击以下软件:弹出一下窗口需选择一些特定的选项默认选项不需要更改,点击next勾选以上选项,点击install进度条安装完毕即可。到以下界面,证明安装成功。接下来安装库文件返回电脑桌面...
- colorama,一个超好用的 Python 库!
-
大家好,今天为大家分享一个超好用的Python库-colorama。Github地址:https://github.com/tartley/coloramaPythoncolorama库是一...
- python制作仪表盘图(python绘制仪表盘)
-
今天教大家用pyecharts画仪表盘仪表盘(Gauge)是一种拟物化的图表,刻度表示度量,指针表示维度,指针角度表示数值。仪表盘图表就像汽车的速度表一样,有一个圆形的表盘及相应的刻度,有一个指针...
- 总结90条写Python程序的建议(python写作)
-
1.首先 建议1、理解Pythonic概念—-详见Python中的《Python之禅》 建议2、编写Pythonic代码 (1)避免不规范代码,比如只用大小写区分变量、使用容易...
- [oeasy]python0137_相加运算_python之禅_import_this_显式转化
-
变量类型相加运算回忆上次内容上次讲了是从键盘输入变量input函数可以有提示字符串需要有具体的变量接收输入的字符串输入单个变量没有问题但是输入两个变量之后一相加就非常离谱添加图片注释,不超过1...
- Python入门学习记录之一:变量(python中变量的规则)
-
写这个,主要是对自己学习python知识的一个总结,也是加深自己的印象。变量(英文:variable),也叫标识符。在python中,变量的命名规则有以下三点:>变量名只能包含字母、数字和下划线...
- 掌握Python的"魔法":特殊方法与属性完全指南
-
在Python的世界里,以双下划线开头和结尾的"魔法成员"(如__init__、__str__)是面向对象编程的核心。它们赋予开发者定制类行为的超能力,让自定义对象像内置类型一样优雅工...
- 11个Python技巧 不Pythonic 实用大于纯粹
-
虽然Python有一套强大的设计哲学(体现在“Python之禅”中),但总有一些情况需要我们“打破规则”来解决特定问题。这触及了Python哲学中一个非常核心的理念:“实用主义胜于纯粹主义”...
- Python 从入门到精通 第三课 诗意的Python之禅
-
导言:Python之禅,英文名是TheZenOfPython。最早由TimPeters在Python邮件列表中发表,它包含了影响Python编程语言设计的20条软件编写原则。它作为复活节彩蛋...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python字典遍历 (54)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (60)
- python读取文件夹下所有文件 (59)
- java调用python脚本 (56)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)