在进行操作系统和数据库系统管理时经常会遇到在日志文件中查找某个字符或者按照时间截取某个时间段的日志进行分析。
今天早上就遇到一个MySQL数据库上的问题mysql数据库在0-3点的时候数据库会话连接tpscpu和iowait等都比平时大了许多。
为了定位这个时间段内到底发生了那些慢查询消耗了资源就需要在slow.log慢查询日志进行查询截取和分析。
在处理过程中对几种常用的日志截取方法进行了汇总和测试
截取日志段的的方法汇总与测试
方式一 确定时间段的行号使用head和tail命令截取
搜索时间 Time: 151212 00:00:00
先到gg到文件最前面然后搜索 /Time: 151212 得到
1979016 # Time: 151212 0:00:15
文件总行数为
# wc -l slow-query-169-1212.log
1999422 slow-query-169-1212.log
1999422 limit 0,20;
然后在到文件最后面G, 搜索4点之后开始的文件 /Time: 151212 4 得到
1987392 # Time: 151212 4:00:05
确定需要查询的时间段行号后使用head和tail命令进行截取
>>> 1987392 - 1979016;
8376
需要截取的日志最后行号为 1979016想用head 命令然后在用tail命令截取最后的 8376 行即可命令为
head -n 1979016 slow-query-169-1212.log | tail -n 8376 > slow-query-169-1212_00-03.log
方式二 确定时间段的行号使用sed命令截取
截取 151212 0-3点之间的慢查询日志
sed -n ‘1979016,1987392p‘ slow-query-169-1212.log > slow-query-169-1212_00-03.log
>>> 1987392 - 1979016;
8376
该部分文件应该有 8376 行数据确认正常
方式三确定时间段行号后使用awk命令截取
截取 151212 0-3点之间的慢查询日志
awk -F"\n" ‘{if(NR>=1979016&&NR <=1987392)print $0 }‘ slow-query-169-1212.log > slow-query-169-1212_00-03.log
方式四不需先确定行号直接用sed取出日志段
slow log都是以 # Time: 151212 0:00:15 开头直接用sed 取出其中的日志
sed -n ‘/^# Time: 151212 0/,/^# Time: 151212 4/p‘ slow-query-169-1212.log > part.log --这样的效果就和刚才上面的效果相同取出了0 -3 点之间的数据
如果是想取出 151211 这一天的数据则命令为
sed -n ‘/^# Time: 151211/,/^# Time: 151212/p‘ slow-query-169-1212.log > part.log --取出了151211 这一天的日志
注意使用sed 时两行之间的选择项一定要对应不然结果就不是想要的结果了
sed -n ‘/^# Time: 151212/,/^# Time: 151212 4/p‘ slow-query-169-1212.log > part.log --前后两个时间点不同搜索的是全部 # Time: 151212开头的
使用pt工具对截取的日志进行分析
分析这段时间的日志的命令如下
/usr/local/pt/bin/pt-query-digest /data/bbs/slow-query-169-1212_00-03.log > /data/bbs/slow-query-169-1212_00-03-report.log
这是默认的分析和排序方法可以根据需求选择其他pt报告分析方法
注1 vim中两种查询方式
命令模式下按‘/’然后输入要查找的字符Enter。和/的区别是一个向前下找一个向后上。
另外‘*’可以查找当前光标下的word完全符合‘g*’则部分符合以#代替*表示向后上找
注2 几种文件处理方法的简单举例
sed是按行处理的不会将整个文件加载到内存中可以放心使用
要切出从2012-02-09到2012-09-10的所有数据行假设你的日志文件以yyyy-MM-dd的日期格式开头只需要
sed -n ‘/^2012-02-09/,/^2012-09-10/p‘ whole.log > part.log
无论怎么样你都必须使用某一个程序把这个文件读出来并且用一定的规则来加以过滤。
在Linux中使用cat和grep对文件进行操作已经可以说是最经济合理的了。
占用一定的系统资源是肯定的具体的话跟你使用的catgrep以及linux内核都有一定关系所以可能会略有不同。
一般不要在系统里出现那么大的日志文件最好在一开始就做好日志的大小限制以及合理的日志转储和备份。
显示文件的第2到第6行
sed -n ‘2,6p‘ file
需要加-n参数.
head -n 6 file|tail -n 4
awk 也能达到要求
awk -F"\n" ‘{if(NR>=2&&NR <=6)print $0 }‘ file
本文出自 “yumushui的专栏” 博客,请务必保留此出处http://yumushui.blog.51cto.com/6300893/1722262
原文地址:http://yumushui.blog.51cto.com/6300893/1722262