日志分析常见命令
日志中包含了程序在遇到异常情况所打印的堆栈信息,访间用户IP地址、请求url、应用响应时间、内存垃圾回收信息,以及系统开发者在系统运行过程中想打印的任何信息。通过异常堆栈,可以定位到依赖的谁宕机了,产生问题的程序bug的行,对异常进行修复;通过访问IP和请求url和参数,排查是否遭到攻击,以及攻击的形式;通过应用的响应时间、垃圾回收,以及系统load来判断系统负载,是否需要增加机器;通过线程dump,判断是否死锁及线程阻塞的原因;通过应用的GC (Garbage Collection, 即内存回收)日志,对系统代码和JVM内存参数进行优化,减少GC次数与stop the world时间,优化应用响应时间。
而想要通过日志分析得出系统产生问题的原因,首先我们需要熟悉日志分析的相关命令和脚本从日志中筛选出有价值的内容
1.常见命令
cat命令查看文件内容
如果日志文件较小可以直接用cat命令打印出来,如果日志文件较大请不要这样做,打开一个过大的文件可能会占用大量的系统资源,从而影响系统的对外服务
cat 文件名
cat -n 文件名 可以查看行号
more和less分页显示文件
cat缺点在于:一旦执行无法进行交互和控制,more可以分页的展示文件
按Enter键显示文件下一行
按空格键便是下一页
F键显示下一屏内容
B键显示下一屏内容
另一个 less 命令在于它可以支持内容查找
输入/user即可
tail查看文件尾
因为日志一般都是以追加的形式写入的,新写的内容一般都在文件末尾处
-n 参数后跟的数字表示显示文件最后几行,如果为4则显示文件最后四行
-f 可以让程序不退出,并且持续的显示文件新增的行
head查看文件头
与tail类似
sort 内容排序
sort默认是按照字符串顺序排序的
-n 按照数字排序
-r 按照逆序排列
-k 指定排序的列
-t 指定列分隔符
实例:
先cat一下我们的文件,可以看到数字是无序的
我们使用 sort -n 和 sort -n -r 可以发现文件进行了一次增序和降序的排序
为了熟悉 -k 和 -t 我自己写了一个例子
同样是先cat一下文件,我们的目的是要根据第二列的数字进行排序
我们就可以输入 sort -k 2 -t ' ' -n b.txt ,就是对第二列的数据进行排序,通过空格来区分列
wc字符统计
wc -l 查看文件的行数
wc -c 查看文件包含的字节数
wc -L 查看文件中最长的行的长度
wc -w 查看文件中有多少个单词
uniq 查出重复的行
uniq可以用来显示文件中行重复的个数,或者显示仅出现一次的行,以及仅仅显示重复的行
uniq去重针对的仅是连续的两行,因此他经常和sort一起用
以上是文件内容
通过sort排序,再通过uniq去重统计
-c 在每行前加上出现的次数
-u 显示只出现一次的行
-d 展示出现重复的 行
grep字符串查找
grep 可以查找文件中符合条件的字符串,如果文件内容符合就会把这行打印
grep -c 显示查找到的行号
grep的查找也支持正则表达式例如查找u开头r结尾的字符串
find文件查找
如果只知道文件名称不知道,文件路径那我们就需要 find 命令了
我们也可以查找以txt结尾的文件
我们还可以使用find命令递归的打印当前目录
find . -print
expr表达式求值
实际操作中,尝尝需要对表达式进行求值,使用expr指令,能够对运算表达式或者字符串进行运算求值
注意:乘法运算时需要用反斜杠(\)对 *进行转义
URL访问工具
想在命令行下通过http协议访问网页文档,就要用到 curl 工具,它支持HTTP,HTTPS,FTP,Telnet等多种协议,常被用来在命令行下抓取网页和监控Web服务器状态
这里仅简单的介绍他一些常用的用法比如发起网页请求
加上 -i 返回带header的文档
-I 只返回header信息
2.实际需求
单条命令还是无法成气候的,需要将命令组合起来来使用才会更有效率
比如说我们的日志是这样的(数据都是伪造的)
174.119.232.29 GET www.xxx1.com 404 12312 174.119.232.29 GET www.xxx2.com 200 657 174.119.124.30 GET www.xxx1.com 500 123 174.119.232.30 GET www.xxx3.com 200 1421 174.119.232.30 GET www.xxx4.com 301 4554 174.646.232.29 GET www.xxx4.com 404 45 174.546.232.29 GET www.xxx2.com 302 123 174.453.232.34 GET www.xxx1.com 303 4345 174.119.232.29 GET www.xxx5.com 404 753 174.123.232.29 GET www.xxx1.com 404 78678 174.119.232.36 GET www.xxx5.com 400 764 174.546.232.29 GET www.xxx8.com 200 43 174.546.232.29 GET www.xxx3.com 200 123 174.567.232.78 GET www.xxx2.com 200 786 174.119.232.29 GET www.xxx5.com 404 786 174.119.232.83 GET www.xxx7.com 404 7673 174.453.232.72 GET www.xxx1.com 200 37 174.119.232.50 GET www.xxx9.com 404 767 174.534.232.96 GET www.xxx1.com 200 112
1.查看请求访问量
查找访问量前五的ip地址
cat access.log |cut -f1 -d " " | sort | uniq -c | sort -k 1 -n -r | head -5
2.查看最耗时最多的页面
cat access.log |sort -k 5 -n -r | head -10
2.awk程序
awk能够提供一个类似于编程的开放环境,能够让你自定义文本处理的规则,修改和重新组织文件中的内容
awk通用格式:
awk [option] 'pattern {action}' file
option: 命令的选项
pattern:行匹配规则
action: 具体执行的操作
file: 文件
如果没有pattern,则对所有行执行action,而如果没有action,则打印所有行
例如:
1.打印文件指定的列
awk '{print $1}' access.log | head -10
awk 默认用空格将一行分割成多个列,可以用 -F 指定列的分隔符
2.使用/xxx1/查找包含xxx1的行,并打印3,4列
awk '/xxx1/{print $3,$4}' access.log |head -10
3.查找length大于等于40的行,并打印他的第5列
awk 'length($0)>=40{print $5}' access.log |head -5
$0代表当前行,length($0)即当前行长度
4.对内容进行格式化输出
awk '{line=sprintf("methodType:%s,responseCode:%s,responseTime:%s", $2,$4,$5);print line}' access.log |head -10
定义一个line的变量,用于接收sprintf的输出,打印line
awk最厉害的一点便是支持编程的方式来处理文本,我们可以简单操作一下
1.创建一个文件
2.将之前的命令拷到里面去
3.通过 -f 我们可以指定包含文本处理程序的脚本文件(由于灵活的编程功能,所以提供了无限的扩展空间)
4. awk -f script access.log |head -10
当然这里也就是简单的介绍了awk的一些简单功能,如果要全部掌握就得自己找资料去了解了,但这些简单的功能也足够让我们看出他的强大