从日志文件中提取java堆栈跟踪的工具 [英] Tool to extract java stack traces from log files
本文介绍了从日志文件中提取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屋!
查看全文