拒绝蛮力,高效查看Linux日志文件!

原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。

简介

日常分析问题时,会频繁地查看分析日志,但如果蛮力去查看日志,耗时费力还不一定有效果,因此我总结了在Linux常用的一些日志查看技巧,提升日志阅读效率。

grep查找日志

在我们查找某些异常日志时,经常需要同时查看异常前面或后面的一些日志,因为有时前面或后面的日志就已经标识出异常原因了,而grep的 -A-B-C选项就提供了这种功能,如下:

查找ERROR日志,以及它的后10行
$ grep -A 10 ERROR app.log

查找ERROR日志,以及它的前10行
$ grep -B 10 ERROR app.log

-C代表前10行和后10行
$ grep -C 10 ERROR app.log

查看某个时间段的日志

有时,需要查看某个时间段的日志,比如凌晨2点15分系统出现报警,上班后我们想看看这段时间的日志,看能不能找到点线索,方法如下:

导出02:14到02:16分的日志
awk '/2022-06-24T02:14/,/2022-06-24T02:1[6-9]/' app.log > app0215.log

使用sed也是可以的
sed -n '/2022-06-24T02:14/,/2022-06-24T02:1[6-9]/p' app.log > app0215.log

注:awk与sed实际并不解析时间,它们只是按正则匹配,匹配到第一个正则时,开始输出行,直到遇到第二个正则关闭,所以如果你的日志中没有能匹配第二个正则的行,将导致一直输出到尾行!所以一般需要将第二个正则变宽松点,如上面的 /2022-06-24T02:1[6-9]/,以避免出现这种情况

查看最后10条错误

更多情况是,上班时发现系统有报警,于是想立马看看刚刚发生了什么,即查找最近的异常日志,如下:

最容易想到的是tail,但有可能最后1000行日志全是正常日志
$ tail -n 1000 app.log | less

最后10条异常, tac会反向读取日志行,然后用grep找到10个异常日志,再用tac又反向一次就正向了
$ tac app.log | grep -n -m10 ERROR | tac

还有一种是从刚报警的时间点开始导出到尾行,比如从2分钟前的5点15分开始导出,如下:

$ tac app.log | sed '/2022-06-24T17:15/q' | tac > app1715.log

原理与上面类似,只不过是换成了sed,sed默认会输出处理的每一行,而q指令代表退出程序,所以上面程序含义是从日志末尾开始输出日志,直到遇到正则 /2022-06-24T17:15/停止输出。

awk分段查找

对于像Java程序,异常日志一般会是一段一段的,且每段带有异常栈,如下:

拒绝蛮力,高效查看Linux日志文件!
但grep是一行一行过滤的,如何一整段一整段的过滤异常栈呢?awk就提供了这种功能,当将awk中RS变量指定为空时,awk就会一段一段的读取并处理文本,如下:
查找异常日志,并保留异常栈
awk -v RS= -v ORS='\n\n' '/Exception/' app_error.log | less
  1. -v RS=等效于 -v RS='',设置RS变量为空,使得awk一段一段地读取日志
  2. -v ORS='\n\n'设置ORS变量为2个换行,使得awk一段一段的输出
  3. /Exception/代表过滤出包含正则Exception的段

使用less查看

一般情况下,使用less可以更快速的查看日志,比如通过 tail -n10000取出最近1w条日志,通过less查看,如下:

tail -n 10000 app.log | less

看日志时,有一个很常见的需求,就是很多日志都是当前不需要关心的,需要将它们过滤掉,less提供了 &/的功能,可快速过滤掉不想看的日志,从而找到问题日志,如下:

拒绝蛮力,高效查看Linux日志文件!
操作步骤:
  1. 先输入 &,再输入 !进入Non-match过滤模式。
  2. 然后输入正则 netns,再按Enter,排除掉这种正常的日志,过滤后又发现有很多drop_caches日志。
  3. 然后也是先输入 &,再输入 !,再直接按 上箭头快速获取上次的输入内容,再接着输入 |drop_caches,将drop_caches日志也过滤掉。
  4. 哦豁,发现了一个oom killer日志!

使用vim查看

less可以一行一行的排除,但如果要一段一段的排除,如日志中经常会有一些常见且无影响的错误日志,这种情况可以通过vim配合awk排除,如下:

tail -n 10000 app_error.log | vim -

拒绝蛮力,高效查看Linux日志文件!
操作步骤:
  1. 先输入 :,进入vim的命令模式
  2. 再输入 %!awk -v RS= -v ORS='\n\n' ...,执行awk命令,其中 %代表当前文件所有内容, !代表执行命令,所以 %!代表将当前文件内容输入到命令中
  3. 然后awk规则中输入 '\!/订单号不存在/'并回车,这代表排除段中包含 订单号不存在的段,排除后又发现很多 没有找到该昵称异常。
  4. 接着输入 :再按 上箭头快速获取上次输入内容,并补充 && \!/没有找到该昵称/,将这种常见异常也过滤掉。
  5. 哦豁,发现了一个NullPointerException异常!

其它工具

有时为节省磁盘空间,日志会压缩成 *.gz格式,这也是可以直接查看的,如下:

类似cat,同时解压并输出内容
zcat app.log.gz

类似grep,同时解压并查找内容
zgrep -m 10 ERROR app.log.gz

类似less,同时解压并查看内容
zless app.log.gz

而在处理时间方面,dateutils工具包用起来会更方便一些,如下:

CentOS7安装dateutils
$ wget https://download-ib01.fedoraproject.org/pub/epel/8/Everything/x86_64/Packages/d/dateutils-0.4.9-1.el8.x86_64.rpm && rpm -Uvh dateutils-0.4.9-1.el8.x86_64.rpm
Ubuntu安装dateutils
$ apt install dateutils

根据时间范围过滤日志,可指定时间串格式
$ cat dmesg.log | dategrep -i '%a %b %d %H:%M:%S %Y' '>=2022-06-24T12:00:00 &&

注:Ubuntu中对命令进行了改名,dategrep叫dateutils.dgrep,dateconv叫dateutils.dconv

总结

这些工具组合起来还是很强大的,这也是为什么即使在公司有日志平台的情况下,依然还是有很多人会去使用命令行!

往期内容

接口偶尔超时,竟又是JVM停顿的锅!
耗时几个月,终于找到了JVM停顿十几秒的原因
mysql的timestamp会存在时区问题?
真正理解可重复读事务隔离级别
密码学入门
字符编码解惑

Original: https://www.cnblogs.com/codelogs/p/16410363.html
Author: 扣钉日记
Title: 拒绝蛮力,高效查看Linux日志文件!

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/714744/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 【转】iOS NFC

    概述 iOS 在 iOS11(iPhone7/iPhone7 Plus) 之后开放 NFC 主动扫描功能 并且在 iOS13(iPhoneXS/iPhoneXR) 后开放 NFC …

    技术杂谈 2023年6月1日
    089
  • Node.js 执行系统命令

    我们在使用Node.js的时候总有一些时候需要执行一些系统命令,与系统做一些交互,或者调用其他语言,这个时候该怎么做呢?当然是使用 child_process模块了,这个模块翻译过…

    技术杂谈 2023年5月31日
    064
  • Oracle 11g密码过期问题解决方案

    【问题描述】近日,使用sqlplus登陆短消息Oracle(Oracle培训 )数据库时提示”ORA-28000: 帐号被锁定”。【原因/触发因素】确定是由…

    技术杂谈 2023年6月1日
    082
  • 无需编程,基于PostgreSQL零代码生成CRUD增删改查RESTful API接口

    无需编程,基于PostgreSQL零代码生成CRUD增删改查RESTful API接口 回顾 在前面文章中,已经介绍了crudapi主要功能和使用方式,crudapi 1.2.0只…

    技术杂谈 2023年7月25日
    099
  • 哪些纪录片可以称为「神作」?

    自然纪录片(这里面又大概分为地球、宇宙、人体三个大部分) 一、BBC地球篇首先是BBC三大”镇馆之宝”(自封的)《地球脉动》:几乎算是有史以来最好的生态纪录…

    技术杂谈 2023年5月31日
    081
  • 基于ADS1292芯片的解决方案之芯片简析

    基本资料: ADS1292芯片是多通道同步采样 24 位 Δ-Σ 模数转换器 (ADC),它们具有内置的可编程增益放大器 (PGA)、内部基准和板载振荡器。 ADS1292 包含 …

    技术杂谈 2023年5月31日
    084
  • 堆栈

    目录: 9、【剑指Offer学习】【面试题09:用两个栈实现队列】 30、【剑指Offer学习】【面试题30:包含min函数的栈】 31、【剑指Offer学习】【面试题31:栈的压…

    技术杂谈 2023年6月21日
    097
  • mstar gdb调试

    当进程崩溃出现coredump提示时,可以利用gdb来定位出错函数。 首先,把core_dump.XXX.gz文件从设备上拷贝出来,放到编译环境下,另外,还要把代码目录下的symb…

    技术杂谈 2023年5月31日
    093
  • 浅析重复线性渐变repeating-linear-gradient如何使用

    CSS3 线性渐变(linear-gradient)我们比较熟悉,但是有没有了解过重复线性渐变(repeating-linear-gradient)呢? repeating-lin…

    技术杂谈 2023年5月31日
    0115
  • 深入C++03:面向对象

    📕面向对象 类和对象、this指针 不用做太多笔记,都可以看初识C++的笔记; 记住👀:声明后面都要加” ;“,比如声明方法和变量还有…

    技术杂谈 2023年7月25日
    072
  • quartz框架(六)-ThreadPool

    本篇博文,博主将介绍Quartz框架中ThreadPool线程池相关的内容。线程池顾名思义,就是一个可以帮助我们来进行线程资源管理的对象。在web开发中,常见的就有数据库连接池,h…

    技术杂谈 2023年7月24日
    080
  • 【Golang】golang实现sha256加密函数

    golang实现sha256加密函数 //Sha256加密 func Sha256(src string) string { m := sha256.New() m.Write([…

    技术杂谈 2023年6月1日
    088
  • 景深计算公式

    δ——容许弥散圆直径f——镜头焦距F——镜头的拍摄光圈值L——对焦距离ΔL1——前景深ΔL2——后景深ΔL——景深 从上图表公式(1)和(2)可以看出,后景深>前景深。 景深…

    技术杂谈 2023年5月31日
    0110
  • JavaSE-分页工具方法

    借用mybatisPlus的分页对象,可以自己创建一个此方法针对集合设置分页,与SQL无关。 /** * * @param pageNo 第&#x51…

    技术杂谈 2023年6月21日
    085
  • Django admin实现TextField字段changelist页面换行、空格正常显示

    问题背景 在Django后台的使用admin view绑定model后,可以很方便的通过网页对底层的数据表进行增删查改操作。在实际工作中有一些数据字段会存储了json或者其他包含换…

    技术杂谈 2023年6月21日
    0106
  • 技能篇:关于缓存数据的一致性探讨

    为了更快响应请求,减少不必要的查询,加速数据的处理,数据缓存是我们日常开发绕不过去的环节 关注公众号,一起交流,微信搜一搜: 潜行前行 缓存的意义 数据的保存,离不开磁盘或者内存的…

    技术杂谈 2023年7月25日
    079
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球