我的连接池工具似乎有问题。获取数据库连接时有很大的延迟。
我试图实现的目标是在发生此事件时从日志文件中获取所有案例。
相关的日志条目看起来像
...
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"
如果该命令符合您的要求,将解释该命令。