从日志文件中提取具有特定模式的 2 个日期并比较这 2 个日期

从日志文件中提取具有特定模式的 2 个日期并比较这 2 个日期

我的连接池工具似乎有问题。获取数据库连接时有很大的延迟。
我试图实现的目标是在发生此事件时从日志文件中获取所有案例。

相关的日志条目看起来像

...
2018-03-12 16:18:44,070 efault task-166 gine.jdbc.internal.LogicalConnectionImpl DEBUG Obtaining JDBC connection
...
2018-03-12 16:20:23,172 efault task-166 gine.jdbc.internal.LogicalConnectionImpl DEBUG Obtained JDBC connection
...

所以如果模式 'DEBUG 获取 JDBC 连接' 发生然后提取日期 '2018-03-12 16:18:44,070'以及当模式'DEBUG 获得 JDBC 连接' 找到,然后提取其日期并比较 2 个日期。如果差异超过 2 秒,则记录。

我知道用一行代码解决这个问题相当复杂,但是不编写程序是否可以做到这一点?

答案1

我将使用下面的 awk 脚本来处理它。该脚本搜索“obtaining”和“obtained”字符串。典型的情况是先找到“obtaining”字符串,然后再找到“obtained”字符串;如果首先找到“获得”行,则该行将d1被取消设置或为零,因此不会报告。否则,我们提取日期的主要部分(逗号之前),将其转换为自纪元以来的秒数,然后重新添加毫秒。该值保存到d1.

一旦看到“获得的”字符串,就以相同的方式计算其日期,然后我们检查差异;如果超过 2 秒,我们会报告。无论哪种方式,我们都会重置d1以重新开始该过程。

将以下内容保存到脚本中,命名为您想要的任何名称(可能是alert-jdbc.awk),然后使用 运行它awk -f alert-jdbc.awk < log-file-here

该脚本需要 GNU 日期实用程序才能转换任意日期。

/DEBUG Obtaining JDBC connection/ {
  split($1 " " $2, dates, /,/)
  "date -d \"" dates[1]"\" +%s" | getline seconds
  d1=seconds + dates[2]/1000
}

/DEBUG Obtained JDBC connection/ {
  if (d1) {
    split($1 " " $2, dates, /,/)
    "date -d \"" dates[1]"\" +%s" | getline seconds
    d2=seconds + dates[2]/1000
    if (d2 - d1 > 2) {
        print "More than 2 seconds for: " $0
    }
    d1=0
  }
}

答案2

尝试这个:

Delay=$(( 
  ($(date -d "`awk '/DEBUG Obtained JDBC connection/{print $1" "$2}' file.log |
  cut -d ',' -f1 | tail -n1`" +%s)) -
  ($(date -d "`awk '/DEBUG Obtaining JDBC connection/{print $1" "$2}' file.log |
  cut -d ',' -f1 | tail -n1`" +%s)) ))
echo "$Delay Sec"

如果该命令符合您的要求,将解释该命令。

相关内容