java 使用 grok 解析日志

由于在一些复杂无结构的日志,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

java 使用 grok 解析日志_第1张图片

 

2、pom配置maven依赖

 
    io.thekraken
    grok
    0.1.5
 

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;
        }
    }
}

运行结果:

你可能感兴趣的:(java)