zoukankan      html  css  js  c++  java
  • 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("
    }");
            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

  • 相关阅读:
    some requirement checks failed
    FTP下载文件时拒绝登陆申请怎么办?
    Linux查看与设定别名
    如何编写shell脚本
    Linux shell是什么
    Linux命令大全之查看登陆用户信息
    Linux命令大全之挂载命令
    论第二次作业之输入输出格式怎么合格(才疏学浅说的不对轻点喷我)
    文件词数统计
    软件工程作业--第一周
  • 原文地址:https://www.cnblogs.com/yb38156/p/14296509.html
Copyright © 2011-2022 走看看