由於在一些複雜無結構的日誌,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;
}
}
}
運行結果: