如何从日志中分析执行时间?

时间:2011-06-26 11:41:51

标签: java logging

我正在使用带有%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}

3 个答案:

答案 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:您可以使用此工具从命令行导出日志文件(提供控制台模式)。