我正在使用带有%d ...
转换模式的log4j,这使得每条日志消息都以如下所示的时间戳开头:2011-06-26 14:34:16,357
。我记录我提交的每个SQL查询。
我想分析SQL查询之间的增量,甚至可能聚合完全相同的SQL查询的多次执行以获得最大时间和平均时间..
你会怎么做?使用grep和一些excel工作?是否有一些常见的方式/工具/脚本可以让我的生活变得轻松?
P.S。为了让事情变得更烦人,我的SQL是多行的,所以log4jdbc sqltiming logger就像这样打印出来:
2011-06-26 14:43:32,112 [SelectCampaignTask ] INFO : jdbc.sqltiming - CREATE INDEX idx ON tab CRLF
USING btree (id1, id2, emf); {executed in 34788 msec}
答案 0 :(得分:1)
我很想写一个Groovy / Perl / Python脚本来使用正则表达式来分离日志。
如果您将输出转储为CSV,您当然可以使用Excel来挖掘数据。
另一种方法是将DateTime,线程,类别级别和日志消息写入数据库表。编写SQL查询来编写报告是生成自定义报告w.r.t时间范围的一种非常简单的方法,如过滤器等。
对于大多数开发人员来说,挖掘日志文件似乎是一种成熟的习惯,而且通常是学习脚本语言的好时机......
答案 1 :(得分:1)
我刚刚在Python中写下了一个小脚本,解决了同样的问题。我是Python的新手,我能够在不到几个小时的时间内完成它。
以下是我的代码的关键部分:
import re
logfile = open("jdbcPerf.log", "r").readlines()
#extract the interesting lines
for line in logfile:
m= re.search('^((\d+)-(\d+)-(\d+)) | ({executed )', line)
if m:
print m.group()
#extract name of servlet and execution time
for line in selectedLines:
#extract servlet name
m = re.search('servlets.([a-zA-Z]*).([a-zA-Z]*)', line)
if m:
print m.group()
#extract execution time
m = re.search('( \d+ )',line)
if m:
print m.group()
您可以将其用作骨架,然后执行您需要的任何数据聚合。
我的日志文件如下所示:
2013-05-26 08:22:10,583 DEBUG [jdbc.sqltiming]
com.myclass.servlets.BrowseCategories.categoryList(null:-1)
16. select category0_.id as id, category0_.name as name from categories category0_
{executed in 7 msec}
答案 2 :(得分:1)
LogMX是一个日志查看器工具,可以在解析日期和处理多行日志事件时将任何日志文件导出为CSV。您还可以(在其GUI中)计算多个日志事件之间经过的时间。
为此,您首先需要使用Log4j模式或正则表达式(在LogMX中)描述您的日志格式。
PS:您可以使用此工具从命令行导出日志文件(提供控制台模式)。