从日志文件中提取java堆栈跟踪的工具 [英] Tool to extract java stack traces from log files

查看:162
本文介绍了从日志文件中提取java堆栈跟踪的工具的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否有任何工具可以提取出现在日志文件中的堆栈跟踪列表,可能会计数唯一的?



编辑:我会预先提供一些不是基于GUI的内容,并在后台运行,并提供某种报告。我有很多从几个环境收集的日志,只是想快速概述。

解决方案

我已经提出了以下Groovy脚本。这当然是根据我的需要进行了很大的调整,但我希望它可以帮助某人。

  def traceMap = [:] 

//保存在缓冲区中的行数
def BUFFER_SIZE = 100

//堆栈跟踪行的模式
def TRACE_LINE_PATTERN ='^ [ \\\\t] + at。* $'

//记录行模式,我们尝试捕获完整跟踪
def LOG_LINE_PATTERN ='^([< ;#] [^ /] | \\\\\\dd (例如,替换日期和交易信息,可能使相似的踪迹看起来不一样)
def REPLACE_PATTERNS = [
'^ \\\d + -\\\d + \\ @。*? tksId:[^ \\]] + \\]',
'^< \\w + \\d +,\\d + [^>] *?> ;百分比抑制率^>] *>?;百分比抑制率^>] *>?;百分比抑制率^>] *>?; <',
'^ ####< [^>] +?>百分比抑制率^>] *>?;百分比抑制率^>] *>?;百分比抑制率^>] *>?;百分比抑制率^>] *>?;百分比抑制率^>] *>?;百分比抑制率^>] *>?;百分比抑制率^>] *>?;百分比抑制率^>] *>?;百分比抑制率^>] *>?;百分比抑制率^>] *>?; <',
'<([\\\w:] +)?TransaktionsID> [^<] +?< /([\\w:] +)?TransaktionsID& ,
'<([\\\w:] +)?TransaktionsTid> [^<] +?< /([\\w:] +)?TransaktionsTid>'
]

new File('。')。eachFile {File file - >
if(file.name.contains('。log')|| file.name.contains('。out')){
def bufferLines = []
file.withReader {Reader读者 - >
while(reader.ready()){
def String line = reader.readLine()
if(line.matches(TRACE_LINE_PATTERN)){
def trace = []
for(def i = bufferLines.size() - 1; i> = 0; i--){
if(!bufferLines [i] .matches(LOG_LINE_PATTERN)){
trace .add(0,bufferLines [i])
} else {
trace.add(0,bufferLines [i])
break
}
}
trace.add(line)
if(reader.ready()){
line = reader.readLine()
while(!line.matches(LOG_LINE_PATTERN)){
trace.add(line)
if(reader.ready()){
line = reader.readLine()
} else {
break;
}
}
}
def traceString = trace.join(\\\

REPLACE_PATTERNS.each {pattern - >
traceString = traceString.replaceAll(pattern,'')
}
if(traceMap.containsKey(traceString)){
traceMap.put(traceString,traceMap.get(traceString) + 1)
} else {
traceMap.put(traceString,1)
}
}
//保留最后一行的缓冲区。
bufferLines.add(line)
if(bufferLines.size()> BUFFER_SIZE){
bufferLines.remove(0)
}
}
}
}
}

traceMap = traceMap.sort {it.value}

traceMap.reverseEach {trace,number - >
println - 已发生$ number次-------------------------------------- ---
println trace
}


Is there any tool that can extract a list of stack traces appearing in the log file and probably count unique ones?

EDIT: I would preffer something that is not GUI-based and be run on the background and give some kind of report back. I have quite many logs gathered from several environments and just would like to get quick overview.

解决方案

I have come up with the following Groovy script. It is, of course, very much adjusted to my needs, but I hope it helps someone.

def traceMap = [:]

// Number of lines to keep in buffer
def BUFFER_SIZE = 100

// Pattern for stack trace line
def TRACE_LINE_PATTERN = '^[\\s\\t]+at .*$'

// Log line pattern between which we try to capture full trace
def LOG_LINE_PATTERN = '^([<#][^/]|\\d\\d).*$'

// List of patterns to replace in final captured stack trace line 
// (e.g. replace date and transaction information that may make similar traces to look as different)
def REPLACE_PATTERNS = [
  '^\\d+-\\d+\\@.*?tksId: [^\\]]+\\]',
  '^<\\w+ \\d+, \\d+ [^>]*?> <[^>]*?> <[^>]*?> <[^>]*?> <',
  '^####<[^>]+?> <[^>]*?> <[^>]*?> <[^>]*?> <[^>]*?> <[^>]*?> <[^>]*?> <[^>]*?> <[^>]*?> <[^>]*?> <[^>]*?> <',
  '<([\\w:]+)?TransaktionsID>[^<]+?</([\\w:]+)?TransaktionsID>',
  '<([\\w:]+)?TransaktionsTid>[^<]+?</([\\w:]+)?TransaktionsTid>'
]

new File('.').eachFile { File file ->
  if (file.name.contains('.log') || file.name.contains('.out')) {
    def bufferLines = []
    file.withReader { Reader reader ->
      while (reader.ready()) {      
        def String line = reader.readLine()
        if (line.matches(TRACE_LINE_PATTERN)) {
          def trace = []
          for(def i = bufferLines.size() - 1; i >= 0; i--) {
            if (!bufferLines[i].matches(LOG_LINE_PATTERN)) {
              trace.add(0, bufferLines[i])
            } else {
              trace.add(0, bufferLines[i])
              break
            }
          }
          trace.add(line)
          if (reader.ready()) {
            line = reader.readLine()
            while (!line.matches(LOG_LINE_PATTERN)) {
              trace.add(line)
              if (reader.ready()) {
                line = reader.readLine()
              } else {
                break;
              }
            }
          }
          def traceString = trace.join("\n")
          REPLACE_PATTERNS.each { pattern ->
            traceString = traceString.replaceAll(pattern, '')
          }
          if (traceMap.containsKey(traceString)) {
            traceMap.put(traceString, traceMap.get(traceString) + 1)
          } else {
            traceMap.put(traceString, 1)
          }
        }
        // Keep the buffer of last lines.
        bufferLines.add(line)
        if (bufferLines.size() > BUFFER_SIZE) {
          bufferLines.remove(0)
        }
      }
    }
  }
}

traceMap = traceMap.sort { it.value }

traceMap.reverseEach { trace, number ->
  println "-- Occured $number times -----------------------------------------"
  println trace
}

这篇关于从日志文件中提取java堆栈跟踪的工具的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆