为啥从空值有一个纪元时间?

Posted

技术标签:

【中文标题】为啥从空值有一个纪元时间?【英文标题】:Why there is an epoch time from empty value?为什么从空值有一个纪元时间? 【发布时间】: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 语句与这个值进行比较时,它会触发通知,即使它不应该触发。有没有办法避免将空字符串用于比较,但从日志文件中获取其他时间值?

【问题讨论】:

【参考方案1】:

date 的手册定义传递给-d 的空字符串将被视为一天的开始。

但是,您可以依赖 -f/--file 选项和进程替换:

date -f <(echo -n "$your_date")

-f 选项允许您将文件作为参数传递,其中的每一行都将被视为-d 的输入。空文件只会返回空输出。

进程替换用于动态创建一个临时文件(准确地说是一个匿名管道,但这仍然是一个文件),该文件将仅包含变量的内容,如果变量为undefined 或空字符串,否则为一行。

【讨论】:

以上是关于为啥从空值有一个纪元时间?的主要内容,如果未能解决你的问题,请参考以下文章

PHP 5.4:禁用警告“从空值创建默认对象”

从空值 Laravel 8 创建默认对象

laravel-5.4 - 错误:从空值创建默认对象

如何修复 PHP Strict 错误“从空值创建默认对象”?

在 laravel 中具有雄辩关系的更新期间从空值创建默认对象

数据框用唯一的纪元时间替换每一行空值