Linux 下用 awk 分析日志文件实例
off999 2025-01-21 20:36 45 浏览 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 代码飙升330倍:从入门到精通的四种性能优化实践
-
花下猫语:性能优化是每个程序员的必修课,但你是否想过,除了更换算法,还有哪些“大招”?这篇文章堪称典范,它将一个普通的函数,通过四套组合拳,硬生生把性能提升了330倍!作者不仅展示了“术”,更传授...
- 7 段不到 50 行的 Python 脚本,解决 7 个真实麻烦:代码、场景与可复制
-
“本文整理自开发者AbdurRahman在Stackademic的真实记录,所有代码均经过最小化删减,确保在50行内即可运行。每段脚本都对应一个日常场景,拿来即用,无需额外依赖。一、在朋...
- Python3.14:终于摆脱了GIL的限制
-
前言Python中最遭人诟病的设计之一就是GIL。GIL(全局解释器锁)是CPython的一个互斥锁,确保任何时刻只有一个线程可以执行Python字节码,这样可以避免多个线程同时操作内部数据结...
- Python Web开发实战:3小时从零搭建个人博客
-
一、为什么选Python做Web开发?Python在Web领域的优势很突出:o开发快:Django、Flask这些框架把常用功能都封装好了,不用重复写代码,能快速把想法变成能用的产品o需求多:行业...
- 图解Python编程:从入门到精通系列教程(附全套速查表)
-
引言本系列教程展开讲解Python编程语言,Python是一门开源免费、通用型的脚本编程语言,它上手简单,功能强大,它也是互联网最热门的编程语言之一。Python生态丰富,库(模块)极其丰富,这使...
- Python 并发编程实战:从基础到实战应用
-
并发编程是提升Python程序效率的关键技能,尤其在处理多任务场景时作用显著。本文将系统介绍Python中主流的并发实现方式,帮助你根据场景选择最优方案。一、多线程编程(threading)核...
- 吴恩达亲自授课,适合初学者的Python编程课程上线
-
吴恩达教授开新课了,还是亲自授课!今天,人工智能著名学者、斯坦福大学教授吴恩达在社交平台X上发帖介绍了一门新课程——AIPythonforBeginners,旨在从头开始讲授Python...
- Python GUI 编程:tkinter 初学者入门指南——Ttk 小部件
-
在本文中,将介绍Tkinter.ttk主题小部件,是常规Tkinter小部件的升级版本。Tkinter有两种小部件:经典小部件、主题小部件。Tkinter于1991年推出了经典小部件,...
- Python turtle模块编程实践教程
-
一、模块概述与核心概念1.1turtle模块简介定义:turtle是Python标准库中的2D绘图模块,基于Logo语言的海龟绘图理念实现。核心原理:坐标系系统:原点(0,0)位于画布中心X轴:向右...
- Python 中的asyncio 编程入门示例-1
-
Python的asyncio库是用于编写并发代码的,它使用async/await语法。它为编写异步程序提供了基础,通过非阻塞调用高效处理I/O密集型操作,适用于涉及网络连接、文件I/O...
- 30天学会Python,开启编程新世界
-
在当今这个数字化无处不在的时代,Python凭借其精炼的语法架构、卓越的性能以及多元化的应用领域,稳坐编程语言排行榜的前列。无论是投身于数据分析、人工智能的探索,还是Web开发的构建,亦或是自动化办公...
- Python基础知识(IO编程)
-
1.文件读写读写文件是Python语言最常见的IO操作。通过数据盘读写文件的功能都是由操作系统提供的,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个...
- Python零基础到精通,这8个入门技巧让你少走弯路,7天速通编程!
-
Python学习就像玩积木,从最基础的块开始,一步步搭建出复杂的作品。我记得刚开始学Python时也是一头雾水,走了不少弯路。现在回头看,其实掌握几个核心概念,就能快速入门这门编程语言。来聊聊怎么用最...
- 一文带你了解Python Socket 编程
-
大家好,我是皮皮。前言Socket又称为套接字,它是所有网络通信的基础。网络通信其实就是进程间的通信,Socket主要是使用IP地址,协议,端口号来标识一个进程。端口号的范围为0~65535(用户端口...
- Python-面向对象编程入门
-
面向对象编程是一种非常流行的编程范式(programmingparadigm),所谓编程范式就是程序设计的方法论,简单的说就是程序员对程序的认知和理解以及他们编写代码的方式。类和对象面向对象编程:把...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)