由于在一些复杂无结构的日志,json、xml等解析规则无法解决,就可以用到Grok,Grok本身使用正则表达式解析日志,由于正则表达式的强大功能,使得Grok可解析 syslog logs、apache and other webserver logs、mysql logs等任意格式。
1、正则表达式库
Grok内置了许多的正则表达式库,便于我们直接使用开发(github搜索grok,项目一般都有这个pattern文件)。
也可以直接用下面任一地址,下载保存
https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns 或
https://github.com/thekrakken/java-grok/blob/master/src/main/resources/patterns/patterns
2、pom配置maven依赖
<dependency>
<groupId>io.thekraken</groupId>
<artifactId>grok</artifactId>
<version>0.1.5</version>
</dependency>
3、java编码
package com.grok;
import io.thekraken.grok.api.Grok;
import io.thekraken.grok.api.Match;
import io.thekraken.grok.api.exception.GrokException;
import java.util.Map;
public class GrokTest {
private static final String GROK_PATTERN_PATH = "D:\\work\\workspace\\basp_monitor\\springboot_jpa\\src\\main\\resources\\patterns";
public static void main(String[] args) {
String pattern="%{MONTH}\\s+%{MONTHDAY}\\s+%{TIME}\\s+%{YEAR}.*%{fromIP}";
String message = "Mon Nov 9 06:47:33 2015; UDP; eth1; 461 bytes; from 88.150.240.169:tag-pm";
Match match = null;
try {
Grok grok = new Grok();
//添加patter配置文件,默认的grok的pattern是null
grok.addPatternFromFile(GROK_PATTERN_PATH);
//添加自定义pattern,当然%{IPV4}可以不用已有pattern,也可以自定义正则表达式
grok.addPattern("fromIP", "%{IPV4}");
grok.compile(pattern);
match = grok.match(message);
match.captures();
if(!match.isNull()){
System.out.println(match.toMap().toString());
System.out.println(match.toJson().toString());
}else{
System.out.println("not match");
}
} catch (GrokException e) {
e.printStackTrace();
match = null;
}
}
}
运行结果: