当前位置: 首页 > Linux

拒绝暴力破解,高效查看Linux日志文件!

时间:2023-04-06 19:11:40 Linux

原创:按钮日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。Introduction在日常分析问题的时候,会经常查看分析日志,但是如果暴力查看日志,既费时费力,又未必见效。因此,我总结了一些Linux常用的日志查看技巧,以提高日志阅读的效率。grepsearchlog我们在查找一些异常日志的时候,往往需要同时查看一些异常前后的日志,因为有时候异常前后的日志已经确定了异常的原因,而-A,-B,-C的grep选项提供了这个功能,如下:#查找ERROR日志,及其最后10行$grep-A10ERRORapp.log#查找ERROR日志,及其前10行$grep-B10ERRORapp.log#-C表示前10行和后10行$grep-C10ERRORapp.log查看某段时间的日志有时候,需要查看某段时间的日志的时间,比如凌晨2点15分系统报警,下班后我们想看看这段时间的日志,看看能不能发现一些蛛丝马迹。方法如下:#导出02:14到02:16的日志awk'/2022-06-24T02:14/,/2022-06-24T02:1[6-9]/'app.log>app0215.log#也可以使用sedsed-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-n1000app.log|less#对于最后10条异常,tac会倒序读取日志行,然后用grep找到10条异常日志,然后再用tac倒序,往前走$tacapp.log|grep-n-m10错误|tac另一种是从报警的时间点导出到最后一行,比如从2分钟前的5点15分开始,如下:$tacapp.log|sed'/2022-06-24T17:15/q'|tac>app1715.log的原理和上面类似,只是换成sed,sed默认会输出处理过的每一行,而q命令是退出程序的意思,所以上面程序的意思是从日志末尾开始输出日志,直到遇到正则模式/2022-06-24T17:15/停止输出awk段搜索。程序,异常日志一般是一段一段的,每一段都有一个异常栈,如下:但是grep是逐行过滤的,如何逐段过滤异常栈呢?awk提供了这个功能。当awk中的RS变量指定为空时,awk会逐条读取并处理文本,如下:#查找异常日志并保留异常堆栈awk-vRS=-vORS='\n\n''/异常/'app_error.log|less-vRS=相当于-vRS='',设置RS变量为空,让awk逐段读取日志-vORS='\n\n'设置ORS变量为2个换行符,这样awksegmentbysegment/Exception/的输出意思是过滤掉包含常规Exception的段使用less查看一般情况下使用less查看日志比较快,比如通过tail-n10000取出最新的1w条日志,通过查看less,如下:tail-n10000app.log|less在查看日志的时候,有一个很常见的需求,就是很多日志目前是不需要的,需要过滤掉。less提供了&/功能,可以快速过滤掉不需要的日志,找到问题日志,如下:操作步骤:先输入&,再输入!进入非匹配过滤模式。然后输入常规的netns回车排除此类正常的日志。过滤后发现drop_caches日志较多。然后先输入&,再输入!,然后直接按向上箭头可以快速获取最后输入的内容,然后输入|drop_caches,过滤掉drop_caches日志。哦,我发现了一个oom杀手日志!使用vim查看less可以逐行排除,但是如果要逐段排除,比如日志中经常有一些常见的不受影响的错误日志,可以通过vim和awk排除,如下:tail-n10000app_error.log|vim-操作步骤:先输入:进入vim的命令模式,然后输入%!awk-vRS=-vORS='\n\n'...执行awk命令,其中%代表所有文件当前文件内容,!表示执行命令,所以%!表示将当前文件的内容输入命令,然后在awk规则中输入'\!/ordernumberdoesnotexist/'回车,表示排除包含ordernumber不存在段的段,排除后,发现昵称没有找到的异常有很多。然后输入:按向上箭头可以快速获取上次输入的内容,加上&&\!/未找到昵称/,这种常见的异常也被过滤掉了。哦,我发现了一个NullPointerException!其他工具有时会将日志压缩成*.gz格式以节省磁盘空间,也可以直接查看,如下:#类似cat,同时解压输出内容zcatapp.log.gz#类似grep,解压同时查找内容zgrep-m10ERRORapp.log.gz#类似less,同时解压查看内容zlessapp.log.gz在处理时间上,dateutils工具包会使用起来更方便,如下:#CentOS7installdateutils$wgethttps://download-ib01.fedoraproject.org/pub/epel/8/Everything/x86_64/Packages/d/dateutils-0.4.9-1.el8.x86_64.rpm&&rpm-Uvhdateutils-0.4.9-1。el8.x86_64.rpm#Ubuntuinstalldateutils$aptinstalldateutils#根据时间范围过滤日志,可以指定时间字符串格式$catdmesg.log|dategrep-i'%a%b%d%H:%M:%S%Y''>=2022-06-24T12:00:00&&