利用shell脚本快速定位日志
我们平时查日志,在测试环境,日志文件只有几个的情况下,我们可以通过找时间接近的文件然后根据关键词定位报错位置,大不了都查一遍,这都可以忍受。但是在实际的生产环境下,服务器集群部署,每天的日志非常多非常多,每台机器都会有几十个甚至多达上百个、数百个日志文件产生。遇到问题需要查询日志时,你会发现如果一个个文件去查,你会崩溃掉。因为这是很费时的重复性工作,而且也不一定能查到。
为了解决这种问题,大多数人会去编写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 --
这样脚本会拷贝用户18300000000的所有操作记录的日志文件到tmp目录里(与shell脚本同目录),然后我们对tmp下的日志进行操作。
在日志太多的情况下,日志可能会被打包压缩,我们可以改下脚本,多一步,先把压缩后的解压缩再进行查找操作。
有的公司会有更高级的做法,例如elk日志分析平台,我们在elk上查日志更加方便,可视化的界面,可选择性更强,多查询条件等。
利用shell脚本快速定位日志的更多相关文章
- 利用shell脚本批量提交网站404死链给百度
网站运营人员对于死链这个概念一定不陌生,网站的一些数据删除或页面改版等都容易制造死链,影响用户体验不说,过多的死链还会影响到网站的整体权重或排名. 百度站长平台提供的死链提交工具,可将网站存在的死链( ...
- 【转载】MySQL被慢sql hang住了,用shell脚本快速清除不断增长的慢sql的办法
原文地址:MySQL被慢sql hang住了,用shell脚本快速清除不断增长的慢sql的办法 作者:mchdba 某个初级dba误删index,mysql漫山遍野全是10S以上的慢sql,mysql ...
- Linux下添加shell脚本使得nginx日志每天定时切割压缩
Linux下添加shell脚本使得nginx日志每天定时切割压缩一 简介 对于nginx的日志文件,特别是access日志,如果我们不做任何处理的话,最后这个文件将会变得非常庞大 这时,无论是出现异常 ...
- 利用shell脚本或者php移动某个文件夹下的文件到各自的日期组成的目录下
背景是这样的:网站一开始访问量比较小,大家就把所有的图片文件上传到一个目录下(比如是/data/images/).后来访问量大了,图片也多了,这样就影响读取效率.所以有个这样的需求,把这些个图片文件移 ...
- shell脚本分析nginx日志
shell脚本分析nginx日志: name=`awk -F ',' '{print $13":"$32}' $file | awk -F ':' '{print $4}'`ech ...
- shell脚本调试打印日志问题
shell脚本调试打印日志问题 1. 需求 我们在编写脚本的时候,有时候需要做调试,便于我们定位问题,有时候等脚本上线之后,我们需要保留脚本执行过程中的记录.便于我们在出问题的时候,定位问题. 2. ...
- 利用shell脚本去备份幸运28源码搭建下载所指定的数据库
#! /bin/bash幸运28源码搭建下载Q[115288oo99]logintool=/home/yx/server/mysql/mysql/bin/mysqldumptool=/home/yx/ ...
- 利用shell脚本实现计划任务功能 V1.2
2013.05.10 mytask 1.2 主程序休眠时间分成若干小的时间片断分段休眠,避免长时间的休眠不能及时响应系统信号. 2013.05.07 mytask 1.1 昨天发布了mytask1. ...
- 利用shell脚本个性化运行jar任务
利用shell脚本可以个性化运行jar任务,废话不多说,直接上代码: #!/bin/bash APP_PATH=/root/bigdata/jars/data_migration_from_sqlse ...
随机推荐
- Cocos2d-x 3.2 的内存管理详解
目标读者:了解 Cocos2d-x 中的节点以及节点树,了解引用计数,了解游戏主循环等概念. 本文首先介绍 Cocos2d-x 3.2 中内存管理的作用,以及各个作用的应用.借由通俗易懂的解释来了解内 ...
- Java的反射机理
Java反射是一种间接操作目标对象的机制,核心是JVM在运行的时候才动态加载类,并且对于任意一个类,都能够知道这个类的全部属性和方法等,调用方法以及访问属性,而且不需要提前在编译期知道运行的对象是什么 ...
- IntersectionObserver API,观察元素是否进入了可视区域
网页开发时,常常需要了解某个元素是否进入了"视口"(viewport),即用户能不能看到它. 上图的绿色方块不断滚动,顶部会提示它的可见性. 传统的实现方法是,监听到scroll事 ...
- Web安全测试学习笔记-DVWA-图片上传
很多网站都有上传资源(图片或者文件)的功能,资源上传后一般会存储在服务器的一个文件夹里面,如果攻击者绕过了上传时候的文件类型验证,传了木马或者其他可执行的代码上去,那服务器就危险了. 我用DVWA的文 ...
- js 生成32位随机数,可用于微信支付流水号(前端生成)
$(function () { /*生成32位随机流水号*/ /*默认去掉了容易混淆的字符oOLl,9gq,Vv,Uu,I1*/ var $chars = 'ABCDEFGHJKMNPQRSTWXYZ ...
- SpringBoot系列——Filter 过滤器
前言 本文记录一下在SpringBoot项目中是如何使用Filter过滤器 代码.测试 Filter过滤器是servlet包下面的东西,因此我们不需要再额外引包 方法一 直接实现Filter接口,并使 ...
- Netty实战:设计一个IM框架
来源:逅弈逐码 bitchat 是一个基于 Netty 的 IM 即时通讯框架 项目地址:https://github.com/all4you/bitchat 快速开始 bitchat-example ...
- ios中仿蚂蚁森林动画效果
参考链接:https://www.jianshu.com/p/0ba9d80f8e77 demo下载链接:https://gitee.com/ovix/TreeWithRandomFruitBtn
- OpenCV:图像的水平、垂直、水平垂直翻转
首先导入相关的库: import cv2 import matplotlib.pyplot as plt 自定义展示图片的函数: def show(image): plt.imshow(image) ...
- git submodule git 子模块管理相关操作
Git 子模块操作相关的一些命令备忘: # 当使用git clone下来的工程中带有submodule时,初始的时候 submodule的内容并不会自动下载下来的,需执行如下命令: git submo ...