在日志中查找字符串以设置警报并生成线程转储

在日志中查找字符串以设置警报并生成线程转储

如果日志文件中存在字符串(找到相关字符串),我需要编写一个脚本来创建、发出警报并获取线程转储 - /tmp/area.log。到目前为止,我可以用两个单独的脚本来完成此操作,但希望将它们合并为一个。

脚本 1:创建警报

filelocation=$1
string=$2
count=$(cat $1 | grep -i "$2" | wc -l)

if [[ "$count" -ge 1 ]];
 then
     echo "WARNING: There are $count occurrences of $2 in log file"
     exit 1
else
     echo "OK: No lines with $2 in log file"
     exit 0
fi

脚本 2:创建线程转储

#!/bin/bash
PID=$(ps -ef | grep java | awk '{print $2}')
N=3
INTERVAL=5

for ((i=1;i<=$N;i++))
do
  # d=$(date +%Y%m%d-%H:%M:%S)
  # dump="/tmp/Threaddump-$PID-$d.txt"
dump="/tmp/ThreadDump-`hostname`-`date '+%F-%H:%M:%S'`.gz"
echo $i of $N: $dump
  /opt/jdk1.8.0_121/jdk1.7.0_40/bin/jstack -l $PID > $dump
   sleep $INTERVAL
done

答案1

很简单,希望您在日志中找到该字符串时要求进行线程转储。

因此,当脚本 1 在日志中找到字符串时,您需要运行线程转储脚本。为此,您需要将线程转储脚本包含在 if [[ "$count" -ge 1 ]];true 块中。

filelocation=$1
string=$2
count=$(cat $1 | grep -i "$2" | wc -l)

if [[ "$count" -ge 1 ]];
 then
     echo "WARNING: There are $count occurrences of $2 in log file"
     PID=$(ps -ef | grep java | awk '{print $2}')
     N=3
     INTERVAL=5

     for ((i=1;i<=$N;i++))
     do
       # d=$(date +%Y%m%d-%H:%M:%S)
       # dump="/tmp/Threaddump-$PID-$d.txt"
     dump="/tmp/ThreadDump-`hostname`-`date '+%F-%H:%M:%S'`.gz"
     echo $i of $N: $dump
       /opt/jdk1.8.0_121/jdk1.7.0_40/bin/jstack -l $PID > $dump
        sleep $INTERVAL
     done

     exit 1
else
     echo "OK: No lines with $2 in log file"
     exit 0
fi

如果您希望脚本不断查找日志并执行线程转储,则需要有一个具有 5-10 秒睡眠的包装循环语句,并连续执行此解析和转储逻辑。

用于持续监控日志的代码更改。

在文件位置语句之后有一个无限循环,包括 60 秒的睡眠(这取决于您需要多少睡眠时间)并在最后一行结束循环。你需要做异常处理,你可以妖魔化这个脚本。

正如 @wildcard 所提到的,您需要优化解析和 PID 部分。

相关内容