java正则表达式从日志文件中提取日志
我有一个6MB的日志文件,带有跟踪信息调试错误日志级别,我想创建一个java正则表达式来获取具有指定日志级别的所有日志 我想获取级别调试的日志,然后唯一的调试类型是extract。 或日志详细信息可能有多行详细信息 以下是日志文件的详细信息:java正则表达式从日志文件中提取日志,java,regex,Java,Regex,我有一个6MB的日志文件,带有跟踪信息调试错误日志级别,我想创建一个java正则表达式来获取具有指定日志级别的所有日志 我想获取级别调试的日志,然后唯一的调试类型是extract。 或日志详细信息可能有多行详细信息 以下是日志文件的详细信息: * DEBUG [2015/11/25 00:06:59] /usr/local/elsa/node/elsa.pl (184) main:: 22497 [undef] Starting process_batch * DEBUG [2015/11/25
* DEBUG [2015/11/25 00:06:59] /usr/local/elsa/node/elsa.pl (184) main:: 22497 [undef]
Starting process_batch
* DEBUG [2015/11/25 00:06:59] /usr/local/elsa/node/elsa.pl (271) main::_process_batch 22497 [undef]
Offline processing: and using tempfile /data/elsa/tmp/buffers/1448438819.71967
* ERROR [2015/11/25 00:06:59] /usr/local/elsa/node/elsa.pl (295) main::_process_batch 22497 [undef]
Unable to parse log line: . Only parsed into:
$VAR1 = [];
* DEBUG [2015/11/25 00:06:59] /usr/local/elsa/node/elsa.pl (316) main::_process_batch 22497 [undef]
Finished job process_batch with 0 logs processed and 0 new programs
* DEBUG [2015/11/25 00:06:59] /usr/local/elsa/node/elsa.pl (318) main::_process_batch 22497 [undef]
file size for file /data/elsa/tmp/buffers/1448438819.71967 is 0
* TRACE [2015/11/25 00:06:59] /usr/local/elsa/node/elsa.pl (327) main::_process_batch 22497 [undef]
No logs recorded
* DEBUG [2015/11/25 00:06:59] /usr/local/elsa/node/elsa.pl (188) main:: 22497 [undef]
Processed 0 records
* INFO [2015/11/25 00:07:00] /usr/local/elsa/node/elsa.pl (206) main:: 22497 [undef]
Exiting after processing 0 records
* TRACE [2015/11/25 00:07:04] /usr/local/elsa/node/elsa.pl (135) main:: 22520 [undef]
Processing file __OPS__...
* DEBUG [2015/11/25 00:07:04] /usr/local/elsa/node/elsa.pl (271) main::_process_batch 22520 [undef]
Offline processing: and using tempfile /data/elsa/tmp/buffers/ops_1448438824.46437
* TRACE [2015/11/25 00:07:04] /usr/local/elsa/node/elsa.pl (135) main:: 22526 [undef]
Processing file __IMPORT__...
* INFO [2015/11/25 00:07:04] /usr/local/elsa/node/Indexer.pm (332) Indexer::initial_validate_directory 22522 [undef]
Deleting stale ops log /data/elsa/tmp/buffers/ops_1448438824.46437
* DEBUG [2015/11/25 00:07:04] /usr/local/elsa/node/Indexer.pm (364) Indexer::initial_validate_directory 22522 [undef]
files: $VAR1 = [
'/data/elsa/tmp/buffers/.',
'/data/elsa/tmp/buffers/..'
];
* DEBUG [2015/11/25 00:07:04] /usr/local/elsa/node/Indexer.pm (366) Indexer::initial_validate_directory 22522 [undef]
considering file /data/elsa/tmp/buffers/.
* DEBUG [2015/11/25 00:07:04] /usr/local/elsa/node/Indexer.pm (366) Indexer::initial_validate_directory 22522 [undef]
considering file /data/elsa/tmp/buffers/..
* TRACE [2015/11/25 00:07:04] /usr/local/elsa/node/Indexer.pm (1782) Indexer::_get_lock 22522 [undef]
Locked directory
* DEBUG [2015/11/25 00:07:04] /usr/local/elsa/node/Indexer.pm (567) Indexer::_validate_directory 22522 [undef]
Wiping via index temp_1
* TRACE [2015/11/25 00:07:04] /usr/local/elsa/node/Indexer.pm (2195) Indexer::_sphinx_index 22522 [undef]
Starting Sphinx indexing for temp_1
* DEBUG [2015/11/25 00:07:04] /usr/local/elsa/node/Indexer.pm (2201) Indexer::_sphinx_index 22522 [undef]
output: Sphinx 2.1.9-id64-release (rel21-r4761)
Copyright (c) 2001-2014, Andrew Aksyonoff
Copyright (c) 2008-2014, Sphinx Technologies Inc (http://sphinxsearch.com)
然后我只想获取指定级别的日志。。。
我使用下面的代码,但它不能正常工作
public class T {
public static CharSequence fromFile(String filename) throws IOException {
FileInputStream input = new FileInputStream(filename);
FileChannel channel = input.getChannel();
ByteBuffer bbuf = channel.map(FileChannel.MapMode.READ_ONLY, 0, (int)channel.size());
CharBuffer cbuf = Charset.forName("8859_1").newDecoder().decode(bbuf);
input.close();
return cbuf;
}
public static void main(String[] args) {
try {
Pattern pattern = Pattern.compile("((DEBUG.*?)(([\n].*?)+)((TRACE)|(ERROR)|(INFO)))");
Matcher matcher = pattern.matcher(fromFile("d:/log.txt"));
int count = 0;
while (matcher.find()) {
String match = matcher.group();
System.out.println("::: "+match.substring(0,match.lastIndexOf(" ")-1));
count++;
}
System.out.println("Total Matches : "+count);
} catch (Exception e) {
System.out.println(e);
}
}
}
我希望所有日志都具有调试级别
其他一些日志文件不能具有“*”模式
请帮忙
提前感谢如果您只想提取调试行,请尝试:
DEBUG[^*]*
您可以通过更改任何其他内容的调试来更改日志信息类型。因此,主要部分将是:
TYPE[^*]*
((\bTRACE\b.?)([\r\n]。?)+((调试)|(错误)|(信息)|($))
也可以使用像
Pattern pattern = Pattern.compile("((\\bTRACE\\b.*?)(([\r\n].*?)+)((DEBUG)|(ERROR)|(INFO)|($$)))");
Matcher matcher = pattern.matcher(fromFile("d:/demo.txt"));
int count = 0;
while (matcher.find()) {
String match = matcher.group();
System.out.println("::: "+match.substring(0,match.lastIndexOf(" ")-1));
count++;
}
使用java代码,我们可以像这样完成这项任务。(从上周末开始我真的很挣扎)。 所以我发布了解决方案
private String logLevelDenied1;
private String logLevelDenied2;
private String logLevelDenied3;
private String logLevelDenied4;
private List<String> readLogFile(String level , LogFilesEnum logFile , int count) throws Exception {
FileInputStream fileInputStream = null;
BufferedReader bufferedReader = null;
try{
fileInputStream = new FileInputStream(getLogFileLocation(logFile));
bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream));
String tempString;
int recordCount = 0;
boolean flag = true;
setDeniedVariables(level);
if(logFile == LogFilesEnum.QUERY || logFile == LogFilesEnum.SEARCHD) {
level = "";
}
List<String> logDetails = new ArrayList<String>();
while (((tempString = bufferedReader.readLine()) != null) && (recordCount < count)) {
if (tempString.contains(level)) {
flag = true;
recordCount++;
logDetails.add(tempString);
while (flag && recordCount<count) {
tempString = bufferedReader.readLine();
if (tempString.contains(logLevelDenied1) || tempString.contains(logLevelDenied2) || tempString.contains(logLevelDenied3) || tempString.contains(logLevelDenied4))
flag = false;
else {
if(tempString.contains(level))
recordCount++;
logDetails.add(tempString);
}
}
}
}
return logDetails;
} catch(Exception e){
e.printStackTrace();
return null;
} finally{
if (fileInputStream != null)
fileInputStream.close();
if (bufferedReader != null)
bufferedReader.close();
}
}
private void setDeniedVariables(String logLevel) {
switch (logLevel.toUpperCase()) {
case "ERROR":
logLevelDenied1 = "TRACE";
logLevelDenied2 = "DEBUG";
logLevelDenied3 = "WARN";
logLevelDenied4 = "INFO";
break;
case "TRACE":
logLevelDenied1 = "ERROR";
logLevelDenied2 = "DEBUG";
logLevelDenied3 = "WARN";
logLevelDenied4 = "INFO";
break;
case "INFO":
logLevelDenied1 = "TRACE";
logLevelDenied2 = "DEBUG";
logLevelDenied3 = "WARN";
logLevelDenied4 = "ERROR";
break;
case "WARN":
logLevelDenied1 = "TRACE";
logLevelDenied2 = "DEBUG";
logLevelDenied3 = "ERROR";
logLevelDenied4 = "INFO";
break;
case "DEBUG":
logLevelDenied1 = "TRACE";
logLevelDenied2 = "ERROR";
logLevelDenied3 = "WARN";
logLevelDenied4 = "INFO";
break;
default :
logLevelDenied1 = "--NONE--";
logLevelDenied2 = "--NONE--";
logLevelDenied3 = "--NONE--";
logLevelDenied4 = "--NONE--";
}
}
私有字符串logLevelDenied1;
私有字符串logLevelDenied2;
私有字符串logLevelDenied3;
私有字符串logLevelDenied4;
私有列表readLogFile(字符串级别、日志文件枚举日志文件、整数计数)引发异常{
FileInputStream FileInputStream=null;
BufferedReader BufferedReader=null;
试一试{
fileInputStream=newfileinputstream(getLogFileLocation(logFile));
bufferedReader=新的bufferedReader(新的InputStreamReader(fileInputStream));
字符串tempString;
int recordCount=0;
布尔标志=真;
setDeniedVariables(级别);
if(logFile==LogFilesEnum.QUERY | | logFile==LogFilesEnum.SEARCHD){
级别=”;
}
List logDetails=new ArrayList();
而((tempString=bufferedReader.readLine())!=null)和(&(recordCount 虽然(flag&&RecordCount这只是一个请求,我正在尝试并继续处理它。还有代码来完成此任务,但它不使用java正则表达式,现在我想使用正则表达式概念OK。问题是结果不完全返回调试级别,它还附带其他级别配置记录器将调试级别的条目写入单独的文件中这不是一个选项吗?除此之外,我看不出您需要正则表达式的原因:DEBUG
应该始终在每行的相同位置亲爱的@Marged您以前做过吗?请告诉我您使用这一行说什么“DEBUG应该始终在每行的相同位置”,那又怎样?您想提取DEBUG
部分INFO/ERROR/TRACE
word,或整个INFO/ERROR/TRACE
内容?实际上这是我的错误,根本不需要,现在是什么?但输出字符串不完整。它在起始位置不包含“*”。只需添加它\*DEBUG[^*]*
(\\bTRACE\\b.*)([\r\n].*)+((调试)-(错误)-(信息)-(124$))这是我这边的原因,因为某些日志文件不能包含“*”。感谢您的支持@m.cekiera