我正在尝试改进一个监视器,该监视器可以读取日志文件并在应用程序停止运行和记录日志时发送通知。为了避免在日志文件旋转且应用程序未记录任何内容时立即收到通知,我添加了一项检查以查看最早的日志行是否早于两分钟。
这里是重要部分的摘要。
<bash lines and variable setting>
LATEST=$(gawk 'match($0, /\[#\|(.*[0-9]*?)T(.*[0-9]*?)\+.*<AppToMonitor>/, m) {print m[1], m[2];} ' $LOG_TO_MONITOR | tail -1 )
OLDEST=$(gawk 'match($0, /\[#\|(.*[0-9]*?)T(.*[0-9]*?)\+.*INFO/, m) {print m[1], m[2];} ' $LOG_TO_MONITOR | head -1)
if [ -z "$LATEST" ]
then
# no line in log
OLDEST_EPOCH=`(date --date="$OLDEST" +%s)`
CURR_MINUS_TWO=$(date +"%Y-%m-%d %T" -d "2 mins ago")
CURR_MINUS_TWO_EPOCH=`(date --date="$CURR_MINUS_TWO" +%s)`
# If oldest log line is over two minutes old
if [[ "$OLDEST_EPOCH" -lt "$CURR_MINUS_TWO_EPOCH" ]]
then
log "No lines found."
<send notification>
else
log "Server.log rotated."
fi
<else and stuff>
当日志轮换时,我仍然收到一些通知,而罪魁祸首是纪元时间是从完全空的日志文件中提取的。我通过使用touch test.log
创建一个空的.log文件,然后设置EMPTY=$(gawk 'match($0, /\[#\|(.*[0-9]*?)T(.*[0-9]*?)\+.*INFO/, m) {print m[1], m[2];} ' /home/USER/test.log | head -1)
进行了测试现在,如果我echo $EMPTY
,我将得到一个空白行。但是,如果我将此空行转换为纪元时间EPOCHEMPTY=`(date --date="$EMPTY" +%s)`
,则会从echo得到纪元时间1584914400。这是指昨天晚上。显然,每次将空日期转换为纪元时间时,都会出现相同的纪元,例如至少在编写时将“ $ EMPTY”替换为“”。
所以问题是,从空行开始的那个纪元时间是什么?
如果if语句使用此值进行比较,则触发该通知,即使它不这样做。有没有一种方法可以避免将空字符串用于比较,而是从日志文件中获取其他时间值?我正在尝试改进一个监视器,该监视器可以读取日志文件并在应用程序停止运行和记录日志时发送通知。为了避免从日志文件旋转和...