查询 Linux 日志
我们通常通过捞服务端日志的方式,排查本地不好复现的问题
根据关键词查找
经常碰到的场景,查询日志中某个关键词,然后具体查看所在位置的上下文
找到开始行
第一步,根据我们的关键信息,定位出关键信息在 log 日志中的所在行
格式 cat -n [日志文件] | grep '[关键词]'
例如,我们查询 test.log 文件,并且设置 peterroe 为关键词,我们就能够查看所有包含 peterroe 关键词的行
$ cat -n test.log | grep 'peterroe'
635 2023-08-28 17:08:48,223 INFO 19480 [peterroe/127.0.0.1/ac1896421693213728111127019480/112ms POST /api/test/] [egg-sequelize](9ms) Executed (default): SELECT `id`, `name`, `cname`, `description`, = 'common';
636 2023-08-28 17:08:48,232 INFO 19480 [peterroe/127.0.0.1/ac1896421693213728111127019480/121ms POST /api/test] [egg-sequelize](7ms) Executed (default): SELECT `id`, `name`, `cname`, `description` = 3;
637 2023-08-28 17:08:48,641 INFO 19480 [peterroe/127.0.0.1/ac1896421693213728111127019480/530ms POST /api/test] [egg-sequelize](10ms) Executed (default): SELECT `id`, `name`, `cname`, `description` = '-test-1' LIMIT 1;-n是为了显示行数- 关键词可以是某个用户或者某个格式的时间戳等,视实际情况而定
如果显示的信息较少,我们就可以清晰地找到关键词出现的位置,例如上面是第 636 行是我们想要的开始行的位置
过滤
有时候关键词出现数量太多上面的内容会输出过多内容,我们可以用 head 和 tail 进行过滤,来看看它们的基本用法
head -n 10 test.log # 查看一个文件的前 10 行内容
tail -n 20 test.log # 查看一个文件的后 20 行内容
cat -n test.log | head -n 10 # 查看一个文件的前 10 行内容, 并且显示行数
cat -n test.log | more # 分页查看, 并且显示行数然后我们就可以再次利用管道将其组合起来了
# 查看 peterroe 关键词出现的所有行中的前 100 行
cat -n test.log | grep 'peterroe' | head -n 100
# 分页查看 peterroe 关键词出现的所有行中的前 100 行
cat -n test.log | grep 'peterroe' | head -n 100 | more查看完整数据
查看从某行开始的完整数据
# 查看 636-700 行的内容
awk 'NR>=636 && NR<=700' test.log
# 打印行数,并且查看 636-700 行的内容
awk 'NR>=636 && NR<=700 {print NR, $0}' test.log
# 打印行数,并且查看 636 行之后的内容,并且进行分页查看
awk 'NR>=636 {print NR, $0}' test.log | more根据时间范围查找
如果知道目标内容出现的时间范围,也可以进行查找(一般日志的输出都会有时间戳)
sed -n '/2023-08-23 10:58:11/,/2023-08-23 14:23:12/p' test.log需要注意的是,上面的两个日期必须是日志中打印出来的日志,否则无效。如果时间细节不确定,也可以精确到分钟、小时等
sed -n '/2023-08-23 10/,/2023-08-23 14/p' test.log如果对时间范围无把握,也有可以尝试用 grep 手动进行时间降级匹配:
# 查找 10 点以后的日志
$ cat -n test.log | grep '2023-08-23 10'
...
...
...
# 查找 10:43 点以后的日志
$ cat -n test.log | grep '2023-08-23 10:43'实时查看
可以用如下命令查看查看试试的日志,执行后,再有新日志打印,会实时输出
tail -f test.log查看最后一些行
或者如果担心新日志会把当前日志顶上去,可以先触发新日志后,查看文件最后一些行的内容
tail -n 1000 test.log