【发布时间】:2020-07-03 21:04:14
【问题描述】:
我正在尝试改进一个监视器,它可以读取日志文件并在应用程序停止运行和记录时发送通知。为了避免在日志文件轮换并且应用程序没有记录任何内容时收到通知,我添加了一个检查以查看最旧的日志行是否超过两分钟。
这是重要部分的 sn-p。
<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 语句与这个值进行比较时,它会触发通知,即使它不应该触发。有没有办法避免将空字符串用于比较,但从日志文件中获取其他时间值?
【问题讨论】: