利用shell脚本快速定位日志

摘要:
为了解决这个问题,大多数人会编写shell脚本来检索日志文件,这样可以筛选出许多无用的文件,并减少日志检查的工作量。在服务器集群部署下,它也适用。我们可以在每台机器的同一目录中放置一个脚本文件,然后通过xshell为所有远程会话执行脚本。所有连接的计算机都可以执行脚本。

我们平时查日志,在测试环境,日志文件只有几个的情况下,我们可以通过找时间接近的文件然后根据关键词定位报错位置,大不了都查一遍,这都可以忍受。但是在实际的生产环境下,服务器集群部署,每天的日志非常多非常多,每台机器都会有几十个甚至多达上百个、数百个日志文件产生。遇到问题需要查询日志时,你会发现如果一个个文件去查,你会崩溃掉。因为这是很费时的重复性工作,而且也不一定能查到。

为了解决这种问题,大多数人会去编写shell脚本,用来检索日志文件,这样能筛掉很多无用文件,减轻查日志的工作量。服务器集群部署下,同样适用,我们可以在每台机器同样的目录下放一份脚本文件,然后通过xshell对所有远程会话执行脚本,所有连接到的机器就都能执行脚本了。

我们快速定位问题的前提是首先定位用户的操作记录信息在哪个几个文件,然后在这个几个文件中找到报错的堆栈信息进行分析,从而找到出错的原因。

缩小报错文件范围,是查日志提高效率的前提。

下面这段代码是就是简单的筛选日志文件的shell脚本。如果你懂shell编程,可以在此基础上修改,添加你自己需要的功能。

#!/bin/bash
#日期$1 关键词$2
date=$1;
key_word=$2;

#日志文件的基础目录
base_path=/home/logs/application/
#基础目录+指定的目录
files_path="$base_path$date/"

#判断指定目录下是否有文件
f_count=$(ls $file_path|grep "^-"|wc -l)
#文件个数为0,退出脚本
if [ $f_count -eq 0 ]
then
echo "目录下没有文件"
exit
fi
#否则继续执行
#目录下的所有文件
files=$(ls $files_path)
#标志位 找到相关日志后,把tmp下的之前的先删除 只执行一次删除
flag=0
echo "start"
for file in $files
do
echo "find in $file"
#文件的全路径
f_p="$files_path$file"
#统计文件中Word的个数
count=$(grep -c $key_word $f_p)
#打印包含key_word
cat $f_p | grep $key_word
if [ $count -gt 0 ]
then
#找到后把tmp清了
if [ $flag -eq 0 ]
then
rm -f tmp/*
fi
#标志位置为1,清除只执行一次
flag=1
#拷贝包含关键词的文件到tmp下
cp $f_p tmp/$file
fi
done
echo "end"

其中base_path是日志文件的根目录,假设我们的日志都是在/home/logs/application/下,每天生成一个日期命名的文件夹放当天的的日志文件,2019-04-18,切割的多个日志文件除固定前缀以外加上索引。
如/home/logs/application/2019-04-18/application_20190418_0.log和/home/logs/application/2019-04-18/application_20190418_1.log

假如截止到今天查询日志时服务器产生了80个文件,我要查某个用户提的工单反馈,我们日志里都会打印用户手机号,那么我们可以这样:

sh find.sh 2019-04-18 18300000000

这样脚本会拷贝用户18300000000的所有操作记录的日志文件到tmp目录里(与shell脚本同目录),然后我们对tmp下的日志进行操作。

在日志太多的情况下,日志可能会被打包压缩,我们可以改下脚本,多一步,先把压缩后的解压缩再进行查找操作。

有的公司会有更高级的做法,例如elk日志分析平台,我们在elk上查日志更加方便,可视化的界面,可选择性更强,多查询条件等。

免责声明:文章转载自《利用shell脚本快速定位日志》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇RestTemplate 工具类以及拦截器配置打印调用日志C#学习笔记(五)——函数下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

输入adb shell 时 提示error: more than one device and emulator

第一种情况:确实用多个设备或者模拟器 解决办法:(指定连接某一个设备或者模拟器) 1、获取模拟器/设备列表   adb devices 2、指定device来执行adb shell   adb -s devicename shell 例如:   adb -s emulator-5554 shell 在多device的时候,执行adb命令...

shell替换

如果表达式中包含特殊字符,Shell 将会进行替换。例如,在双引号中使用变量就是一种替换,转义字符也是一种替换。举个例子: #!/bin/bash a=10 echo -e"Value of a is $a " 运行结果: Value of a is 10 这里 -e 表示对转义字符进行替换。如果不使用 -e 选项,将会原样输出: Value...

Linux shell command line process(命令行处理流程)

Splits the command into tokens that are separated by the fixed set of metacharacters: SPACE, TAB, NEWLINE,;,(,),<,>,|, and&. Types of tokens include words, keywords,...

nginx日志统计分析-shell

nginx日志分析常用命令,包括IP相关统计、页面访问统计、性能分析、蜘蛛抓取统计、TCP连接统计等相关命令的总结 1. IP相关统计 1.1 ip访问量统计 awk '{print $1}' access.log | sort -n | uniq | wc -l 1.2 查看某一时间段的IP访问量(5-6点) grep "07/Jan/2019:0[5-...

shell脚本批量注释

1、使用冒号配合追加输入重定向 推荐使用此方法 冒号在Bash里也是一个命令,表示啥都不做,<<是输入重定向,两个EOF(可用其它特殊成对字符替代)之间的内容通过<<追加给冒号(:), 但是冒号对它们啥都不做,就相当于没做任何处理和输出,就相当于注释了。 [root@web01 ~]# cat oldboy.sh #!/bin/b...

shell判断文件是否存在

1. shell判断文件,目录是否存在或者具有权限2. #!/bin/sh3.4. myPath="/var/log/httpd/"5. myFile="/var /log/httpd/access.log"6.7. # 这里的-x 参数判断$myPath是否存在并且是否具有可执行权限8. if [ ! -x "$myPath"]; then9. mkdi...