将毫秒添加到日志文件时间戳

时间:2019-01-24 07:06:21

标签: awk sed timestamp

我正在查看来自两个不同服务器的日志文件。我知道这两个服务器之间的时间差可以降低到毫秒。为了更好地理解这些消息的顺序,我对调整其中一个日志文件输出以反映相同时间感兴趣。

我通常使用通过awk脚本传递日志文件来执行其他操作,然后将输出传递给更少的内容。看起来像这样:

node[:deploy].nil?

我的想法是,我可以使用~/path/to/myAwkscript.awk /path/to/my/logfile | less / sed向文件中的每个时间戳添加747毫秒。我不反对其他解决方案。每行(除非是某种堆栈跟踪)都以以下格式的awk开头:timestamp

这是我的日志中的时间戳示例:

YYYY-MM-DD HH:MM:SS,MS

查看时,我希望该部分的内容如下:

2019-01-24 01:36:24,487

,然后将行/文件的其余部分恢复为原始。

感谢您的阅读。 -格雷格

1 个答案:

答案 0 :(得分:1)

由于我们对您的输入文件一无所知,因此我们假设您可以提取日期时间并自己在awk中进行操作。

诀窍是使用mktime加上不包含毫秒的日期。这将创建一个纪元时间(自1970-01-01 00:00:00 UTC以来的秒数),您可以在其中添加毫秒数。但是,由于毫秒不能表示为浮点数,因此建议以毫秒而不是秒为单位工作。这样,您就可以使用整数完成所有操作。

示例:

2019-01-24 01:36:24,487
=> mktime("2019 01 24 01 36 24")*1000 + 487
=> 1548293784487

这将返回毫秒总数。现在,您可以通过将所需的747毫秒加上该数字来比较这些数字。

为什么要以毫秒为单位工作?在大多数情况下,只需几秒钟即可完成工作。您会得到类似的东西:

2019-01-24 01:36:24,487
=> mktime("2019 01 24 01 36 24") + 0.487
=> 1548293784.48699998855590820....

您注意到,这不是完全相同的数字,而是四舍五入为最接近的二进制数。这些轻微的舍入错误可能会导致较小的不一致,从而导致日志条目排在第一位。

以下示例将相应地对两个文件进行排序:

这里我们假设log1需要747毫秒的额外时间:

awk '{ time=$1" "$2; ms = substr(time,21,3); time=substr(time,1,19)
       gsub(/[-:]/," ",time); time=mktime(time)*1000 + ms }
     (NR==FNR) { time+=747 }
     { print time, FILENAME, $0 }' log1 log2 | sort -n

这将输出如下内容:

1548293784487 log2 2019-01-24 01:36:24,487 entry
1548293784587 log2 2019-01-24 01:36:24,587 entry
1548293785234 log1 2019-01-24 01:36:24,487 entry
1548293785235 log2 2019-01-24 01:36:25,235 entry
...

备注::这利用了gnu-awk扩展名mktime备注: mktime将转换为纪元,前提是显示的字符串位于服务器的本地时区中。如果两个日志都是在具有不同时区的服务器上生成的,则您必须对代码进行更改以反映这些时区。强烈建议您始终将日志保存在UTC中。