您好,我是码农飞哥,一直想飞暂时在跑个那个老哥。

擅长领域:Java高并发编程,MySQL数据库
本文重点:记录日常工作中查看日志的各种命令。
干货满满,建议收藏,需要用到时常看看。小伙伴们有问题及需要,欢迎踊跃留言哦~ ~ ~。

文章目录


现有两个日志文件,分别是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

这个命令的意思是在根目录 / 下,查找名为 ​​normal.log​​的文件,f 表示查找的是文件。查找结果是:

【高效编码】查询日志的命令老是记不住?没关系,这篇文章帮你记_搜索

使用locate命令

locate命令的使用格式是​​locate [选项] [名称]​

locate

查找以normal.log结尾的所有文件。查找的结果如下:

【高效编码】查询日志的命令老是记不住?没关系,这篇文章帮你记_推送_02

基础的日志查看命令:

head命令

head 命令可用于查看文件开头部分的内容,又一个常用的参数 -n 用于显示行数,默认为10,显示10行的内容。

1. 命令格式:

​head [参数] [文件]​

2. 命令参数,各种操作的含义:

参数

含义

-q

隐藏文件名

-v

显示文件名

-c<树木>

显示字节数

-n<行数>

显示行数

3.实例

  1. 显示normal.log 文件的头10行的命令是:
head
  1. 查询normal.log文件的头20行日志的命令是:
head -n 20
  1. 查询normal.log日志文件除了最后20行的其他所有日志;
head

tail 命令

tail 命令可用于查看文件的内容,有一个常用的参数 -f 常用于查阅正在改变的日志文件。​​tail -f filename​​ 会把 filename 文件里的最尾部的内容显示在屏幕上,并且不断刷新,只要 filename 更新就可以看到最新的文件内容。

1.命令格式

tail [参数] [文件]

2.命令参数

参数

说明

-f

循环读取

-q

不显示处理信息

-v

显示详细的处理信息

-c<数目>

显示的字节数

-n<行数>

显示文件的尾部n行内容

3.实例

  1. 要显示 normal.log 文件的最后 10 行的命令:
tail
  1. 查询日志尾部最后20行日志的命令
tail  -n  20
  1. 查询20行之后的所有日志的命令
tail

cat 命令

cat(英文全拼:concatenate)命令用于连接文件并打印到标准输出设备上。

1.命令格式

cat [-AbeEnstTuv] [--help] [--version]

2.命令参数

参数

说明

-n

由 1 开始对所有输出的行数编号。

-b

和 -n 相似,只不过对于空白行不编号。

-s

当遇到有连续两行以上的空白行,就代换为一行的空白行。

-v

使用 ^ 和 M- 符号,除了 LFD 和 TAB 之外。

3.实例

  1. 把 normal.log 的文档内容加上行号后输入 test.txt 这个文档里:
cat -n normal.log >

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:] ReportController pushReport() @59 - 推送接口接收到的参数是=[]

得到关键日志的行号是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'

需要特别说明的是:上面的两个日期必须是日志中打印出来的日志,否则无效。

  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 pushReport() @59 - 推送接口接收到的参数是=[]

场景四:显示日志文件的大小

一般情况下,我们都是直接通过​​ll​​命令来查询相关的日志

【高效编码】查询日志的命令老是记不住?没关系,这篇文章帮你记_linux_03

但是,这个命令有个不好的地方是显示的文件大小是按照字节数显示的,不太友好。通过命令:ll -h

【高效编码】查询日志的命令老是记不住?没关系,这篇文章帮你记_命令_04


总结

本文相信介绍了日常工作中查询日志所使用到的各种命令,满足日常的工作需要已经绰绰有余。