Java中解析日志常用的是Grok,Grok是一个用于解析logs和其它文件的简单易用的API,并且它可以将这些无结构的logs转换成结构化的数据(JSON),使用正则表达式对logs进行解析,常用的是grok和java-grok,下面来具体说说各自的使用
grok是io.thekraken组织提供的实现,在mven仓库中输入io.thekraken就可以找到对应的jar包
简单Java项目
如果是简单Java项目,直接引入依赖的jar包即可,对于0.1.5的版本,必须引入5个jar包:commons-lang3-3.1.jar、slf4j-api-1.7.25.jar、slf4j-nop-1.7.25.jar、gson-2.2.2.jar、grok-0.1.5.jar
MAVEN项目
如果是MAVEN项目,直接POM文件中添加如下依赖就可以了
io.thekraken
grok
0.1.5
由于logs等结构复杂,所以grok使用正则表达式来解析日志,它对于很多常见的logs(如:mongodb、redis、java)已经内置好了正则表达式库,当然也可以根据logs的格式自定义正则表达式库,使用起来很简单,代码如下:
public static void useGrok() throws Exception {
String GROK_PATTERN_PATH = "src/grok-pattern";
String logMsg = "<165>1 2003-08-24T05:14:15.000003-07:00 192.0.2.1 myproc 8710 - - %% It's time to make the do-nuts.";
String pattern = "%{SYSLOG5424LINE}";
Grok grok = new Grok();
grok.addPatternFromFile(GROK_PATTERN_PATH);
grok.compile(pattern);
Match grokMatch = grok.match(logMsg);
grokMatch.captures();
if(!grokMatch.isNull()){
System.out.println(grokMatch.toMap().toString());
System.out.println(grokMatch.toJson().toString());
}else{
System.out.println("not match");
}
}
可以在Github上查看更多关于grok的使用
java-grok是io.krakens组织提供的实现,在maven仓库中输入io.krakens即可找到对应的jar包
简单Java项目
如果是简单Java项目,直接引入依赖的jar包即可,对应0.1.9版,除了引入java-grok-0.1.9.jar外,还必须引入commons-lang3-3.1.jar
MAVEN项目
如果是MAVEN项目,直接POM文件中添加如下依赖就可以了
io.krakens
java-grok
0.1.9
使用举例
java-grok也内置了许多正则表达式,使用起来相对grok简单,不需要显示地指定pattern文件位置
public static void useJavaGrok() throws Exception {
GrokCompiler grokCompiler = GrokCompiler.newInstance();
grokCompiler.registerDefaultPatterns();
final io.krakens.grok.api.Grok grok = grokCompiler.compile("%{COMBINEDAPACHELOG}");
String log = "112.169.19.192 - - [06/Mar/2013:01:36:30 +0900] \"GET / HTTP/1.1\" 200 44346 \"-\" \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.152 Safari/537.22\"";
io.krakens.grok.api.Match grokMatch = grok.match(log);
final Map capture = grokMatch.capture();
System.out.println(capture);
}
可以在Github上查看更多关于java-grok的使用