首页 > 技术文章 > grep和sed拉取线上日志,nc导入elk

linyufeng 2020-06-30 10:32 原文

创建文件pull复制下面脚本(日志路径自己修改),然后更改权限chmod 777 pull

#!/bin/bash

# 需要读取的文件
source=/opt/logs/catalina.out
# 生成文件
dist=log

# 快速截取,有冒号根据时间匹配截取,没有截取行数
if [[ $1 != *:* ]]
then
	tail -n $1 $source > $dist
else
	# 日期 0当天 -1昨天 1明天,依次类推
	d=0
	if [ -n "$3" ]; then
	d=$3
	fi
	pre="`date -d ''$d' days' +%Y-%m-%d` "
	echo -e "日期: \033[32m$pre\033[0m"

	# 开始时间
	a=$1
	# 结束时间,默认当前时间
	b=`date +%H:%M`

	if [ -n "$2" ]; then
		b=$2
	fi

	echo 时间: "$a ~ $b"
	echo ==============

	start=`grep "${pre}${a}" $source -n | head -n 1 | awk -F: '{print $1}'`
	end=`grep "${pre}${b}" $source -n | tail -n 1 | awk -F: '{print $1}'`
	
	# 如果结束行为空,默认最后
	if [[ $start == "" ]]
	then
		echo 该时间节点无数据
		exit 1
	fi
	# 如果结束行为空,默认最后
	if [[ $end == "" ]]
	then
		end=`wc -l $source | awk '{print $1}'`
	fi
	
	echo 起始行: $start
	echo 结束行: $end

	sed -n ''$start','$end'p' $source > $dist
fi

# 删除数据
curl -XDELETE "http://127.0.0.1:9200/de*"
# 导入elk
nc 127.0.0.1 8081 < $dist
echo
echo -e "\033[31m>>-完成->\033[0m"
  • date -d '0 days' 0当天 -1昨天 1明天,依次类推
  • head -n 1 取第一行
  • awk -F: '{print $1}' 取出行号
  • sed切割日志,用单引号使用变量时,变量要再次使用单引号,格式:'hello'$start'world'

最后两行酌情使用


使用示例:

快速拉取最近100行: 100
./pull 100

拉取今天12点至今: 12:00 ~
./pull 12:00

拉取今天: 00:00 ~ 00:15
./pull 00:00 00:15

拉取昨天: 00:00 ~ 00:15
./pull 00:00 00:15 -1


拉取日志直接导入elk进行分析,使用nc命令. 在最后添加logstash服务ip和端口,代码做了拉取之前先清空(看清楚再用!!!)
nc 127.0.0.1 8080 < $dist

参考:

推荐阅读