[转帖] 拒绝蛮力,高效查看Linux日志文件!
https://www.cnblogs.com/codelogs/p/16410363.html
原创:扣钉日记(微信公众号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程序,异常日志一般会是一段一段的,且每段带有异常栈,如下:
但grep是一行一行过滤的,如何一整段一整段的过滤异常栈呢?awk就提供了这种功能,当将awk中RS变量指定为空时,awk就会一段一段的读取并处理文本,如下:
# 查找异常日志,并保留异常栈
awk -v RS= -v ORS='\n\n' '/Exception/' app_error.log | less
-v RS=等效于-v RS='',设置RS变量为空,使得awk一段一段地读取日志-v ORS='\n\n'设置ORS变量为2个换行,使得awk一段一段的输出/Exception/代表过滤出包含正则Exception的段
使用less查看#
一般情况下,使用less可以更快速的查看日志,比如通过tail -n10000取出最近1w条日志,通过less查看,如下:
tail -n 10000 app.log | less
看日志时,有一个很常见的需求,就是很多日志都是当前不需要关心的,需要将它们过滤掉,less提供了&/的功能,可快速过滤掉不想看的日志,从而找到问题日志,如下:
操作步骤:
- 先输入
&,再输入!进入Non-match过滤模式。 - 然后输入正则
netns,再按Enter,排除掉这种正常的日志,过滤后又发现有很多drop_caches日志。 - 然后也是先输入
&,再输入!,再直接按上箭头快速获取上次的输入内容,再接着输入|drop_caches,将drop_caches日志也过滤掉。 - 哦豁,发现了一个oom killer日志!
使用vim查看#
less可以一行一行的排除,但如果要一段一段的排除,如日志中经常会有一些常见且无影响的错误日志,这种情况可以通过vim配合awk排除,如下:
tail -n 10000 app_error.log | vim -

操作步骤:
- 先输入
:,进入vim的命令模式 - 再输入
%!awk -v RS= -v ORS='\n\n' ...,执行awk命令,其中%代表当前文件所有内容,!代表执行命令,所以%!代表将当前文件内容输入到命令中 - 然后awk规则中输入
'\!/订单号不存在/'并回车,这代表排除段中包含订单号不存在的段,排除后又发现很多没有找到该昵称异常。 - 接着输入
:再按上箭头快速获取上次输入内容,并补充&& \!/没有找到该昵称/,将这种常见异常也过滤掉。 - 哦豁,发现了一个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 && <now'
[Fri Jun 24 12:15:36 2022] bash (23610): drop_caches: 3
[Fri Jun 24 13:16:16 2022] bash (30249): drop_caches: 3
# 有时我们需要将日志中时间串转换为unix时间缀,方便处理
$ head -n4 access.log
127.0.0.1 - - [07/May/2022:19:00:25 +0800] "GET /health HTTP/1.1" 200 4 3ms "-" "curl/7.29.0" "-" "-"
127.0.0.1 - - [07/May/2022:19:00:26 +0800] "GET /health HTTP/1.1" 200 4 2ms "-" "curl/7.29.0" "-" "-"
127.0.0.1 - - [07/May/2022:19:00:27 +0800] "GET /health HTTP/1.1" 200 4 2ms "-" "curl/7.29.0" "-" "-"
127.0.0.1 - - [07/May/2022:19:00:28 +0800] "GET /health HTTP/1.1" 200 4 2ms "-" "curl/7.29.0" "-" "-"
$ head -n4 access.log |dateconv -i '[%d/%b/%Y:%H:%M:%S %Z]' -f '%s' -z 'Asia/Shanghai' -S
127.0.0.1 - - 1651950025 "GET /health HTTP/1.1" 200 4 3ms "-" "curl/7.29.0" "-" "-"
127.0.0.1 - - 1651950026 "GET /health HTTP/1.1" 200 4 2ms "-" "curl/7.29.0" "-" "-"
127.0.0.1 - - 1651950027 "GET /health HTTP/1.1" 200 4 2ms "-" "curl/7.29.0" "-" "-"
127.0.0.1 - - 1651950028 "GET /health HTTP/1.1" 200 4 2ms "-" "curl/7.29.0" "-" "-"
注:Ubuntu中对命令进行了改名,dategrep叫dateutils.dgrep,dateconv叫dateutils.dconv
总结#
这些工具组合起来还是很强大的,这也是为什么即使在公司有日志平台的情况下,依然还是有很多人会去使用命令行!
往期内容#
接口偶尔超时,竟又是JVM停顿的锅!
耗时几个月,终于找到了JVM停顿十几秒的原因
mysql的timestamp会存在时区问题?
真正理解可重复读事务隔离级别
密码学入门
字符编码解惑
[转帖] 拒绝蛮力,高效查看Linux日志文件!的更多相关文章
- 拒绝蛮力,高效查看Linux日志文件!
原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介 日常分析问题时,会频繁地查看分析日志,但如果蛮力去查看日志,耗时费力还不一定有效果,因此我总结了在Linux常用的 ...
- Linux下查看alert日志文件的两种方法
--linux下查看alert日志文件的两种方法: --方法1: SQL> show parameter background_dump_dest; NAME TYPE VALUE ------ ...
- 【linux】linux上 查看tomcat日志文件
1.查看实时日志文件 tail -f catalina.out 2.实时查看日志文件 最后n行 tail -n -f catalina.out 3.退出tail命令 ctrl + C 4.翻页查看 日 ...
- [转帖]Linux日志文件utmp、wtmp、lastlog、messages
Linux日志文件utmp.wtmp.lastlog.messages https://www.cnblogs.com/zhuiluoyu/p/6874255.html 1.有关当前登录用户的信息记录 ...
- Linux查看打日志文件
1.如果文件比较小的话,使用vim直接查看,如果文件比较大的话,使用vim会直接卡主 2.如果想要查看正在滚动的日志文件.这个命令可以查看大文件. tail -f file Ctrl+c 终止tail ...
- linux日志文件
linux日志文件 在系统运行正常的情况下学习了解这些不同的日志文件有助于你在遇到紧急情况时从容找出问题并加以解决. /var/log/messages — 包括整体系统信息,其中也包含系统启动期间的 ...
- Linux - 日志文件
Linux日志文件绝大多数存放在/var/log目录,其中一些日志文件由应用程序创建,其他的则通过syslog来创建. Linux系统日志文件通过syslog守护程序在syslog套接字/dev/lo ...
- /var/log目录下的20个Linux日志文件功能详解
如果愿意在Linux环境方面花费些时间,首先就应该知道日志文件的所在位置以及它们包含的内容.在系统运行正常的情况下学习了解这些不同的日志文件有助于你在遇到紧急情况时从容找出问题并加以解决. 以下介绍的 ...
- /var/log目录下的20个Linux日志文件功能详解 分类: 服务器搭建 linux内核 Raspberry Pi 2015-03-27 19:15 80人阅读 评论(0) 收藏
如果愿意在Linux环境方面花费些时间,首先就应该知道日志文件的所在位置以及它们包含的内容.在系统运行正常的情况下学习了解这些不同的日志文件有助于你在遇到紧急情况时从容找出问题并加以解决. 以下介绍的 ...
- Linux - 日志文件简介
Linux日志文件绝大多数存放在/var/log目录,其中一些日志文件由应用程序创建,其他的则通过syslog来创建. Linux系统日志文件通过syslog守护程序在syslog套接字/dev/lo ...
随机推荐
- Head First 的学习之道
<Head First 设计模式>是一本好书,正如书的封面上说的那样,这是一本重视大脑的学习指南.里面提到了一些学习方法,可以尝试下,看看哪些对你有用: 1. 慢一点,理解的越多,需要记得 ...
- Text Intelligence - TextIn.com AI时代下的智能文档识别、处理、转换
一.智能文档处理介绍 在AI时代,智能文档处理技术正变得越来越重要.它包括了智能文字识别(OCR).智能文档信息抽取.文档图像处理以及文档转换等多个方面.这些技术共同构成了现代信息处理的核心,广泛应用 ...
- Flume快速入门
Flume快速入门 一.简介 高可用.高可靠,分布式的海量日志采集.聚合和传输系统,基于流式架构,灵活简单. event:事件 source:数据源 sink:目标 channel:数据管道 通过获取 ...
- 华为云GaussDB坚持技术引领,以数字化转型激活金融科技新动能
摘要:"银行业数字化转型实践交流会"杭州站顺利收官. 由华为与北京先进数通联合主办的"银行业数字化转型实践交流会"杭州站顺利收官,会议邀请了金融科技先锋企业.机 ...
- makefile:带你了解一种常用于GNU gcc编译的工具语言
摘要:该文章主要介绍makefile,一种常用语GNU gcc编译的工具语言,同时LiteOS也是利用该文件对工程项目进行make构建生成执行文件的. LiteOS源码中使用makefile进行文件的 ...
- 云图说|数据仓库服务 GaussDB(DWS) 的“千里眼、顺风耳”—数据库智能运维
摘要:数据库智能运维(DMS)是GaussDB(DWS) 为客户数据库快速.稳定运行提供保驾护航的能力,对业务数据库所使用磁盘.网络.OS指标数据,集群运行关键性能指标进行收集.监控.分析.通过综合收 ...
- 剖析CWE视图的层次定义和解析方式
摘要:CWE做为软件缺陷分类的重要标准, 对安全研究.安全标准.缺陷管理起了重要的纽带作用.CWE通过编号的类型(类缺陷.基础缺陷和变种缺陷等)形成了多层次的缺陷类型划分体系.本文进一步剖析了CWE视 ...
- SBOM:缓解软件供应链风险的关键
软件包含大量且范围广泛的组件.部分和相互依赖关系.需要有效缓解与使用软件相关的安全风险:需要遵守与组件相关的许可证.通过第三方代码(包括开源软件 (OSS))了解产品中所有项目的出处至关重要,无论这些 ...
- 大端、小端,& 与、 | 或、 ~ 反、 << 左移 >> 右移
小端存储:较低的有效字节存放在较低的存储器地址,较高的字节存放在较高的存储器地址: 大端存储:较低的有效字节存放在较高的存储器地址,较高的字节存放在较低的存储器地址. & 计算操作数的逻辑按位 ...
- 【已解决】:Original error: Could not extract PIDs from ps output. PIDS: [], Procs: [“ps: uiautomator”]
报错截图 因为appium服务用的是1.4.x版本,使用的是 uiatumator1.0在android7.0得不到支持,所以获取PIDS得到空. 解决办法 找到Appium安装目录下node_mod ...