logstash系列-ValueType如何抽象为java类

上一篇讲到logstash的configFile和ValueType是如何按配置层次抽象出来的,具体到logstash的语法,可以看到

Array,Hash,Number,String.......在java中也有对应的类,只是"toString()"后有些微差距,这是一个关键点:

如何借助java.util包来抽象出logstash对应的"java类"

这个需求不好描述,网上搜了很多没有搜到封装过的,只能自己摸索着动手,目前已经封装好并投入使用(lombook自配@Data)

首先抽象出接口ValueType,这里要覆盖toString(),并提供一个isNull()的方法,toString由下面的实现类具体实现(前面讲了关键是toString)

public interface ValueType {

    @Override
    String toString();
    Boolean isNull();

}

然后编写logstash最常用的5个数据类型(其他类型没用到,没有琢磨过)

1、LArray,对应logstash的Array类型,借助java的ArrayList封装实现

注意要添加左右的中括号和双引号

public class LArray implements ValueType {

    //  [ "/var/log/messages", "/var/log/*.log" ]
    private List<String> list;

    public LArray(List<String> list) {
        this.list = list;
    }

    @Override
    public String toString() {
        if (isNull()) {
            return "";
        }
        String str = StringUtils.join(list, "\",\"");
        return "[\"" + str + "\"]";
    }

    @Override
    public Boolean isNull() {
        return CollectionUtils.isEmpty(list);
    }

}

2、LBoolean 对应logstash的Boolean类型,借助java的Boolean封装实现

public class LBoolean implements ValueType {

    //true  false 不带引号
    private Boolean b = false;

    public LBoolean(Boolean b) {
        this.b = b;
    }

    @Override
    public String toString() {
        return b.toString();
    }

    @Override
    public Boolean isNull() {
        return false;
    }

}

3、LHash 对应logstash的Hash类型,借助java的HashMap封装实现

public class LHash<T> implements ValueType {

    //{ "field1" => "value1" "field2" => "value2" }
    // {
    //  "field1" => "value1"
    //  "field2" => "value2"
    //  ...
    //}
    private Map<String, T> map;

    public LHash(Map<String, T> map) {
        this.map = map;
    }

    @Override
    public String toString() {
        if (isNull()) {
            return "";
        }
        StringBuilder sb = new StringBuilder("{");
        //todo  如果T是List的情况
        map.forEach((k, v) -> {
            sb.append("\"").append(k).append("\" => ");
            if (v instanceof String) {
                sb.append("\"");
            }
            sb.append(v);
            if (v instanceof String) {
                sb.append("\" ");
            }
        });
        sb.append("\n}");
        return sb.toString();
    }

    @Override
    public Boolean isNull() {
        return map.isEmpty();
    }
}

4、LNumber 对应logstash的Number类型,借助java的Integer和Float封装实现

public class LNumber implements ValueType {

    //33   33.3   整型或浮点型
    private Integer i;
    private Float f;

    public LNumber(Integer i) {
        this.i = i;
        this.f = null;
    }

    public LNumber(Float f) {
        this.f = f;
        this.i = null;
    }

    @Override
    public String toString() {
        if (i != null) {
            return i.toString();
        }
        if (f != null) {
            return f.toString();
        }
        return "";
    }

    @Override
    public Boolean isNull() {
        return i == null && f == null;
    }

    /**
     * 私有化
     */
    private void setI(Integer i) {
    }

    /**
     * 私有化
     */
    private void setF(Float f) {
    }

}

5、LString 对应logstash的String类型,借助java的String封装实现,这里注意构造方法传入的时候需要自己传入单引号或双引号包围的字符串值

public class LString implements ValueType {

    //双引号或单引号  "aa"   'aa'
    private String str;

    public LString(String str){
        this.str = str;
    }

    @Override
    public String toString() {
        return str;
    }

    @Override
    public Boolean isNull() {
        return StringUtils.isBlank(str);
    }

}

以上是组装Logstash .conf配置文件的语法用java实现的ValueType部分,下一篇讲解如何使用封装Plugin,PluginBlock,Setting

posted @ 2021-01-19 11:06  鼠标的博客  阅读(134)  评论(0编辑  收藏  举报