【问题标题】:Add milliseconds to log file timestamp将毫秒添加到日志文件时间戳
【发布时间】:2019-01-24 07:06:21
【问题描述】:

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

我通常使用通过 awk 脚本传递日志文件来执行其他操作,然后将输出通过管道传输到 less。它看起来像这样:

~/path/to/myAwkscript.awk /path/to/my/logfile | less 

我的想法是,我可以使用sed/awk 为文件中的每个时间戳添加 747 毫秒。我不反对其他解决方案。每行(除非是某种堆栈跟踪)都以 timestamp 开头,格式如下:YYYY-MM-DD HH:MM:SS,MS

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

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

当我审查它时,我希望这部分内容如下:

2019-01-24 01:36:25,234

然后将该行/文件的其余部分作为其原始文件。

感谢阅读。 -格雷格

【问题讨论】:

  • 请先展示您自己的代码,您是如何尝试的等。另外,请展示一些示例输入和您的预期输出。
  • @kvantour 谢谢!就我而言,无论它是否解决,您都给出了 A+ 的答案。谢谢!我简要地开始逐步浏览您拥有的作品。想到日期函数。真相 - 我什至没有机会尝试。一个接一个的曲线球。并且也可以欣赏 Tiw 的回应。没有冒犯的意思。那是一个深夜,我一直在做一些愚蠢的事情,比如把逗号分开,因为我只是没有思考。我想有人可能会进行大脑锻炼。我绝对会对此进行测试并添加我正在做的愚蠢的事情。

标签: awk sed timestamp


【解决方案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 将转换为 epoch 假设呈现的字符串在服务器的本地时区。如果两个日志都是在具有不同时区的服务器上生成的,则您必须更改代码以反映这些时区。强烈建议您的日志始终使用 UTC。

【讨论】:

  • 很抱歉花了这么长时间才回到这里。您的解决方案有效。它不完全符合我的要求。但有你解释的原因。感谢您的时间和帮助。
猜你喜欢
  • 2013-06-22
  • 2011-02-05
  • 2023-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多