您好,我是码农飞哥,一直想飞暂时在跑个那个老哥。
现有两个日志文件,分别是normal.log文件和normal-05-29-2021-1.log.gz
找到日志文件
有时候我们只知道日志文件的名称,但是并不知道日志文件的地址。这种情况下,该如何查找日志文件呢?这里可以用的命令有两个:一个是path命令;一个是locate命令。这两个命令的区别是 path命令是搜索具体的目录;而locate命令式搜索一个数据库(/var/lib/locatedb),这个数据库中含有本地信息。
就本例中搜索:normal.log 文件的位置:
使用path命令
path命令的使用的基本语法是:find < path > < expression > < cmd >
其中:path: 所要搜搜的目录及其所有子目录,默认为当前目录
expression: 所要搜索的文件的特征。
cmd: 对搜索结果进行特定的处理。
find / -name normal.log -type f
这个命令的意思是在根目录 / 下,查找名为 normal.log
的文件,f 表示查找的是文件。查找结果是:
使用locate命令
locate命令的使用格式是locate [选项] [名称]
locate -r normal.log$
查找以normal.log结尾的所有文件。查找的结果如下:
基础的日志查看命令:
head命令
head 命令可用于查看文件开头部分的内容,又一个常用的参数 -n 用于显示行数,默认为10,显示10行的内容。
1. 命令格式:
head [参数] [文件]
2. 命令参数,各种操作的含义:
参数 | 含义 |
-q | 隐藏文件名 |
-v | 显示文件名 |
-c<树木> | 显示字节数 |
-n<行数> | 显示行数 |
3.实例
1.显示normal.log 文件的头10行的命令是:
head normal.log
2.查询normal.log文件的头20行日志的命令是:
head -n 20 normal.log
3.查询normal.log日志文件除了最后20行的其他所有日志;
head -n -20 normal.log
tail 命令
tail 命令可用于查看文件的内容,有一个常用的参数 -f 常用于查阅正在改变的日志文件。tail -f filename
会把 filename 文件里的最尾部的内容显示在屏幕上,并且不断刷新,只要 filename 更新就可以看到最新的文件内容。
1.命令格式
tail [参数] [文件]
2.命令参数
参数 | 说明 |
-f | 循环读取 |
-q | 不显示处理信息 |
-v | 显示详细的处理信息 |
-c<数目> | 显示的字节数 |
-n<行数> | 显示文件的尾部n行内容 |
3.实例
1.要显示 normal.log 文件的最后 10 行的命令:
tail normal.log
2.查询日志尾部最后20行日志的命令
tail -n 20 normal.log
3.查询20行之后的所有日志的命令
tail -n +20 normal.log
cat 命令
cat(英文全拼:concatenate)命令用于连接文件并打印到标准输出设备上。
1.命令格式
cat [-AbeEnstTuv] [--help] [--version] fileName
2.命令参数
参数 | 说明 |
-n | 由 1 开始对所有输出的行数编号。 |
-b | 和 -n 相似,只不过对于空白行不编号。 |
-s | 当遇到有连续两行以上的空白行,就代换为一行的空白行。 |
-v | 使用 ^ 和 M- 符号,除了 LFD 和 TAB 之外。 |
3.实例
1.把 normal.log 的文档内容加上行号后输入 test.txt 这个文档里:
cat -n normal.log > test.txt
grep命令
在介绍查询命令之前我们首先介绍一下grep命令,该命令是一个重要的命令,该命令用于查找含有关键词的数据,包括从文件中查找符合条件的字符串。
1.命令格式:grep [option] pattern [文件名]
。
2.命令参数,各种操作的含义:
命令参数
参数 | 作用 |
-? | 同时显示匹配行上下的?行,如:grep -2 pattern filename 同时显示匹配行的上下2行 |
-b | —byte-offset 打印匹配行前面打印该行所在的快号码 |
-c | —count 只打印匹配的行数,不显示匹配的内容 |
-f | —file=File 从文件中提取模板。空文件中包含0个模板,所以什么都不匹配。 |
-h | —no-filename 当搜索多个文件时,不显示匹配文件名前缀 |
-i | —ignore-case 忽略大小写差别 |
-q | —quiet 取消显示,只返回退出状态,0则表示找到了匹配的行 |
-l | —file-with-matches 打印匹配模板的文件清单 |
-n | —line-number 在匹配的行前面打印行号 |
-s | —silent 不显示关于不存在或者无法读取文件的错误信息 |
-v | —revert-match 反检索,只显示不匹配的行 |
-w | —word-regexp 如果被<和>引用,就把表达式做为一个单词搜索。 |
-V | —version 显示软件版本信息 |
规则表达式:
规则表达 | 含义 |
^ | 锚定行的开始,如:‘^test’ 匹配所有以test开头的行 |
$ | 锚定行的结束,如:‘test$’ 匹配所有以grep结尾的行 |
. | 匹配一个非换行符的字符,如:‘gr.p’ 匹配gr后接一个任意字符,然后是p。 |
* | 匹配零个或多个先前字符 如:'*test' 匹配所有一个或多个空格后紧跟grep的行。 |
grep使用实例
实例1:查找进程
查找名字中包含dcs的所有进程
命令: ps -ef|grep dcs
输出:
[root@i- dcs-api]# ps -ef|grep dcs root 1527 1 0 5月27 ? 00:14:22 java -jar ai-dcs.jar root 17456 13312 0 10:58 pts/2 00:00:00 grep --color=auto dcs
第一条是查找出的进程;第二条结果是grep进程本身,并非真正要找的进程。
实例2: 查找指定进程的个数
命令:ps -ef|grep -c dsc
输出:
[root@i- dcs-api]# ps -ef|grep -c dcs 3
场景一:按照行号查看日志----过滤关键字附近的日志
前面介绍完了各种命令的使用,下面就让我们来实战一下吧。通常我们用grep拿到的日志很少,我们需要查看其附近的日志。
1.得到关键日志的行号:
cat -n normal.log |grep '推送接口'
输出:
[root@i- dcs-]# cat -n normal.log |grep '推送接口' 290 2021.06.02 at 06:00:00 698 CST INFO [http-nio-8087-exec-3]-[traceId:] ReportCo
得到关键日志的行号是290行
2. 查询关键字前10行和后10行的日志:
cat -n normal.log |tail -n +289|head -n 20
其中,tail -n +289
表示查询289行之后的所有日志。head -n 20
则表示在前面的查询结果里再查前20条记录。
场景2: 如何按日期查询呢?
通常我们非常需要查找指定时间段的日志。
sed -n '/2021.06.02 at 06:00:00/,/2021.06.02 at 06:05:40/p' normal.log
需要特别说明的是:上面的两个日期必须是日志中打印出来的日志,否则无效。
1.关于日期的打印,可以先通过grep '2021.06.02 at 06:05:40' normal.log 来确保第4步可以拿到日志。这个根据时间段查询日志是非常有用的命令。
2.如果我们查找的日志很多,打印在屏幕上不方便查看,有两个办法:
(1)使用more和less命令,如: cat -n normal.log |grep '推送接口'|more,这样就分页打印了,通过点击空格键翻页。
(2) 使用>xxx.txt,将其保存到文件中,到时候可以拉下这个文件进行分析,如:cat -n normal.log |grep '推送接口' >test.txt
场景三:日志文件被压缩了如何查看呢?
在实际生产环境中,日志文件会被按时间或者按大小进行压缩。那么该如何查询被压缩的日志文件呢?如下有:normal-05-29-2021-1.log.gz 日志文件,我们可以通过
如下命令进行查看:
zcat -n normal-05-29-2021-1.log.gz |grep '推送'
输出结果是:
[root@i- dcs-api]# zcat -n normal-05-29-2021-1.log.gz |grep '推送' 2021.05.29 at 06:00:00 696 CST INFO [http-nio-8087-exec-1]-[traceId:] ReportController pu
场景四:显示日志文件的大小
一般情况下,我们都是直接通过ll
命令来查询相关的日志
但是,这个命令有个不好的地方是显示的文件大小是按照字节数显示的,不太友好。通过命令:ll -h
总结
本文相信介绍了日常工作中查询日志所使用到的各种命令,满足日常的工作需要已经绰绰有余。