在生产环境,定位问题,经常会遇到日志文件特别多的情况,经常会遇到日志比较难拿的情况,所以有什么方法可以快速拿日志?除了在代码里很好的打印关键日志信息外,也需要掌握Linux查看日志的一些实用方法,下面分享一些常用的日志定位方法
通过关键字查找
查看日志,我们可能经常会使用tail、head、cat、less等命令,不过单纯使用这些命令是很难定位到日志的,所以需要结合其它命令一起使用,比如使用grep命令定位关键字
cat log.log | grep "关键字"
tail log.log | grep "关键字"
grep -i "关键字" log.log
sed -n '/关键字/p' 5003.logs > 1.logs
通过关键字查看前后多少行日志
grep -A 100 '关键字' log.log # 可以显示关键字后面的100行内容
grep -B 100 '关键字' log.log # 可以显示关键字前面的100行内容
grep -C 100 '关键字' log.log # 可以显示关键字前后的100行内容
tail命令:tail命令用于显示文件末尾的内容,默认显示最后10行。通过使用参数-n,可以指定显示的行数。例如,要查看最后100行日志文件的内容,可以使用以下命令:
tail -n 100 <日志文件名>
- head命令:与tail命令相反,head命令用于显示文件的开头内容,默认显示前10行。同样,通过参数-n,可以指定显示的行数。例如,要查看日志文件的前200行内容,可以使用以下命令:
head -n 200 <日志文件名>
grep命令:grep命令用于搜索文件中符合指定条件的文本,并将其输出。通过结合使用grep命令和tail命令,可以在指定时间范围内查看日志。例如,要查看特定时间段内的日志,可以使用以下命令:
grep “特定时间” <日志文件名>
其中,“特定时间”可以使用具体的时间或者正则表达式进行匹配。例如,要查看2021年5月10日9点到11点期间的日志,可以使用以下命令:
grep “2021-05-10 0[9-1][0-9]:” <日志文件名>
这个命令会匹配所有以2021-05-10 09:00到2021-05-10 11:59之间的时间戳的日志行。
tail 命令常见用法
总览:
tail [option]…[file]…
描述:
在标准输出上显示每个File的最后10行。如果多于一个File,会一个接一个地显示,并且在每个文件显示的首部给出文件名。如果没有file,或者file是-,那么就从标准输入上读取。
--retry
即使tail开始就不能访问或者tail运行后不能访问,也不停尝试打开文件,-- 只与-f合用时有用
-c, --bytes=N
输出最后N个字节
-f, --follow=[{name|descriptor}]
当文件增长时,输出后续添加的数据;-f --follow以及--follow=descriptor都是同样的意思
-n, --lines=N
输出最后N行,而并非默认的最后10行
cat命令常见用法
总览:
cat [选项列表] [文件列表]
描述:
将文件列表中的文件或标准输出连接到标准输出
-A, --show-all
-b, --number-noneblank 给非空行输出编号
-E, --show-ends 在每行结束显示$
-n, --number 给所有输出行编号
-s, --sequzee-blank 将所有连续的多个空行替换为一个空行
head命令的常见用法
总览:
head [option]…[file]…
描述:
在标准输出上显示每个file的起始10行。如果多于一个file,则一个接一个显示,并且在每个文件显示的首部给出文件名。如果没有file,或者file为-,那么就从标准输入上读取-c, --bytes=SIZE 打印起始的size字节 -n, --lines=NUMBER 显示起始的NUMBER行,而非默认的起始10行 -q, --quiet, --silent 从不显示给出文件名的首部 -v, --verbose 总是显示给出文件名的首部 grep命令的常见用法 总览: grep [options] patten [file...] 描述: grep搜索以File命名的文件输入(或者是标准输入,如果没有指出文件名,或者给出的文件是-的话),寻找含有与给定的模式 Pattern相匹配的内容的行。默认情况下,grep将含有匹配内容的行打印出来。 -A NUM, --after-context=NUM 打印出紧随匹配行之后的下文NUM行。在响铃的匹配组之间将会打印内容是-- 的一行 -B NUM, --before-context=NUM 打印出匹配行之前的上问NUM行。在响铃的匹配组之间将会打印内容是--的一行 -C NUM, --context=NUM 打印出匹配行的上下文前后各NUM行。在相邻的匹配组之间将会打印内容是--的一行 -G, --basic-regexp 将模式PATTERN作为一个基本的正则表达式来解释 -i, --ignore-case 忽略模式pattern和输入文件中大小写的分别 -n, --line-number 在输出的每行前面加上它所在的文件中它的行号 -o, --only-matching 只显示匹配行中与Pattern相匹配的部分 -r, -R, --Recursive 递归地读取每一目录下的所有目录
实战:
tail -n 10 test.log 查询日志尾部最后10行的日志;
tail -n +10 test.log 查询10行之后的所有日志;
head -n 10 test.log 查询日志文件中的头10行日志;
head -n -10 test.log 查询日志文件除了最后10行的其他所有日志;
场景1: 按行号查看—过滤出关键字附近的日志
因为通常时候我们用grep拿到的日志很少,我们需要查看附近的日志.
我是这样做的,首先: cat -n test.log |grep “地形” 得到关键日志的行号
得到"地形"关键字所在的行号是102行. 此时如果我想查看这个关键字前10行和后10行的日志:
cat -n test.log |tail -n +92|head -n 20
tail -n +92表示查询92行之后的日志
head -n 20 则表示在前面的查询结果里再查前20条记录
场景2:那么按日期怎么查呢? 通常我们非常需要查找指定时间端的日志
sed -n '/2014-12-17 16:17:20/,/2014-12-17 16:17:36/p' test.log
特别说明:上面的两个日期必须是日志中打印出来的日志,否则无效.
关于日期打印,可以先 grep ‘2014-12-17 16:17:20’ test.log 来确定日志中是否有该时间点,以确保第4步可以拿到日志
这个根据时间段查询日志是非常有用的命令.
如果我们查找的日志很多,打印在屏幕上不方便查看, 有两个方法:
(1)使用more和less命令, 如: cat -n test.log |grep “地形” |more 这样就分页打印了,通过点击空格键翻页
(2)使用 >xxx.txt 将其保存到文件中,到时可以拉下这个文件分析.如:
cat -n test.log |grep “地形” >xxx.txt