拒绝蛮力,高效查看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
还有一种是从刚报警的时间点开始导出到尾行,比如5点15分报警,如下:
$ tac app.log | sed '/2022-06-24T17:15/q' | tac > app0515.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
使用less查看
一般的情况下,使用less可以更快速的查看日志,比如通过tail -n10000
取出最近1w条日志,通过less查看,如下:
tail -n 10000 app.log | less
看日志时,有一个很常见的需求,就是很多日志都是当前不需要关心的,需要将它们过滤掉,less提供&/
的功能,可快速过滤掉不想看的日志,从而找到问题日志,如下:
操作步骤:
- 先输入
&
,再输入!
进入Non-match过滤模式。 - 然后输入正则
netns
,再按Enter,排除掉这种正常的日志,过滤后又发现有很多drop_caches日志。 - 然后也是先输入
&
,再输入!
,再直接按上箭头
快速获取上次的输入内容,再接着输入|drop_caches
,将drop_caches日志也过滤掉。 - oh! 发现了一个oom killer日志!
使用vim查看
less可以一行一行的排除,但如果要一段一段的排除,如日志中经常会有一些常见且无影响的错误日志,这种情况可以通过vim配合awk排除,如下:
tail -n 10000 app_error.log | vim -
操作步骤:
- 先输入
:
,进入vim的命令模式 - 再输入
%!awk -v RS= ...
,执行awk命令,其中%
代表当前文件所有内容,!
代表执行命令,所以%!
代表将当前文件内容输入到命令中 - 然后输入
\!/订单号不存在/
,这代表排除段中包含订单号不存在
的段。 - 然后又是
上箭头
,并补充要排除的段,直到发现感兴趣的异常栈即可。
其它工具
有时为节省磁盘空间,日志会压缩成*.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下查看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查看打日志文件
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 ...
- LSOF查看linux中文件打开情况
如何查看linux中文件打开情况 前言 我们都知道,在linux下,“一切皆文件”,因此有时候查看文件的打开情况,就显得格外重要,而这里有一个命令能够在这件事上很好的帮助我们-它就是lsof. lin ...
随机推荐
- java获取登录ip和地址
//获取HttpServletRequest对象 ServletRequestAttributes attributes = (ServletRequestAttributes) RequestCon ...
- Java学习day23
今天学习了下拉框实现与简单游戏的实现 package com.Cra2iTeT.snake; import javax.swing.*; import java.awt.*; import java. ...
- 计算属性、侦听属性、局部与全局组件使用、组件通信(父子互传)、ref属性、动态组件和keep-alive、插槽
今日内容概要 计算属性 侦听属性 局部组件和全局组件 组件通信之父传子 组件通信之子传父 ref属性(组件间通信) 动态组件和keep-alive 插槽 内容详细 1.计算属性 # 插值的普通函数,只 ...
- python基础练习题(题目 斐波那契数列II)
day16 --------------------------------------------------------------- 实例024:斐波那契数列II 题目 有一分数序列:2/1,3 ...
- C/C++游戏项目:中国程序员一定要会的中国象棋教程
中国象棋是中国一种流传十分广泛的游戏. 下棋双方根据自己对棋局形式的理解和对棋艺规律的掌握,调动车马,组织兵力,协调作战在棋盘这块特定的战场上进行着象征性的军事战斗. 象棋,亦作"象碁&qu ...
- Python常用数据结构-字典——2.1 字典方法 keys()
python字典常用方法: keys() # 获取所有的键 values() # 获取所有的值 items() # 获 ...
- Linux服务器如何识别移动硬盘?
序言 通常我们使用的移动硬盘或U盘一般都是ntfs或fat32的文件系统,常跟服务器打交道的小伙伴,会经常遇到把移动硬盘或U盘上的数据拷贝到Linux服务器上.绝大多数Linux发行版内核支持fat3 ...
- 掌握AI学习路上核心理论知识,你绝对不能错过这份最全资料包
人工智能成为当下科技发展的代表之一,持续受到了不少追捧,不管你是否是这一专业的学生或者职场人,学习并掌握一项新潮技能总是不会被同龄人淘汰的.我曾经问过别人.也被别人问过关于学习人工智能(AI)最好的方 ...
- 优化 Docker 镜像大小常见方法
平时我们构建的 Docker 镜像通常比较大,占用大量的磁盘空间,随着容器的大规模部署,同样也会浪费宝贵的带宽资源.本文将介绍几种常用的方法来优化 Docker 镜像大小,这里我们使用 Docker ...
- 文件传输协议:FTP、TFTP、SFTP有什么区别?
一个执着于技术的公众号 FTP 提供一种在服务器和客户机之间上传和下载文件的有效方式:是基于TCP的传输,FTP采用双TCP连接方式:支持授权与认证机制,提供目录列表功能. ---控制连接使用TCP端 ...