上一篇讲到logstash的configFile和ValueType是如何按配置层次抽象出来的,具体到logstash的语法,可以看到
Array,Hash,Number,String.......在java中也有对应的类,只是"toString()"后有些微差距,这是一个关键点:
如何借助java.util包来抽象出logstash对应的"java类"
这个需求不好描述,网上搜了很多没有搜到封装过的,只能自己摸索着动手,目前已经封装好并投入使用(lombook自配@Data)
首先抽象出接口ValueType,这里要覆盖toString(),并提供一个isNull()的方法,toString由下面的实现类具体实现(前面讲了关键是toString)
public interfaceValueType {
@Override
String toString();
Boolean isNull();
}
然后编写logstash最常用的5个数据类型(其他类型没用到,没有琢磨过)
1、LArray,对应logstash的Array类型,借助java的ArrayList封装实现
注意要添加左右的中括号和双引号
public class LArray implementsValueType {//[ "/var/log/messages", "/var/log/*.log" ]
private Listlist;public LArray(Listlist) {this.list =list;
}
@OverridepublicString toString() {if(isNull()) {return "";
}
String str= StringUtils.join(list, "\",\"");return "[\"" + str + "\"]";
}
@OverridepublicBoolean isNull() {returnCollectionUtils.isEmpty(list);
}
}
2、LBoolean 对应logstash的Boolean类型,借助java的Boolean封装实现
public class LBoolean implementsValueType {//true false 不带引号
private Boolean b = false;publicLBoolean(Boolean b) {this.b =b;
}
@OverridepublicString toString() {returnb.toString();
}
@OverridepublicBoolean isNull() {return false;
}
}
3、LHash 对应logstash的Hash类型,借助java的HashMap封装实现
public class LHash implementsValueType {//{ "field1" => "value1" "field2" => "value2" }//{//"field1" => "value1"//"field2" => "value2"//...//}
private Mapmap;public LHash(Mapmap) {this.map =map;
}
@OverridepublicString toString() {if(isNull()) {return "";
}
StringBuilder sb= new StringBuilder("{");//todo 如果T是List的情况
map.forEach((k, v) ->{
sb.append("\"").append(k).append("\" => ");if (v instanceofString) {
sb.append("\"");
}
sb.append(v);if (v instanceofString) {
sb.append("\" ");
}
});
sb.append("\n}");returnsb.toString();
}
@OverridepublicBoolean isNull() {returnmap.isEmpty();
}
}
4、LNumber 对应logstash的Number类型,借助java的Integer和Float封装实现
public class LNumber implementsValueType {//33 33.3 整型或浮点型
privateInteger i;privateFloat f;publicLNumber(Integer i) {this.i =i;this.f = null;
}publicLNumber(Float f) {this.f =f;this.i = null;
}
@OverridepublicString toString() {if (i != null) {returni.toString();
}if (f != null) {returnf.toString();
}return "";
}
@OverridepublicBoolean isNull() {return i == null && f == null;
}/*** 私有化*/
private voidsetI(Integer i) {
}/*** 私有化*/
private voidsetF(Float f) {
}
}
5、LString 对应logstash的String类型,借助java的String封装实现,这里注意构造方法传入的时候需要自己传入单引号或双引号包围的字符串值
public class LString implementsValueType {//双引号或单引号 "aa" 'aa'
privateString str;publicLString(String str){this.str =str;
}
@OverridepublicString toString() {returnstr;
}
@OverridepublicBoolean isNull() {returnStringUtils.isBlank(str);
}
}
以上是组装Logstash .conf配置文件的语法用java实现的ValueType部分,下一篇讲解如何使用封装Plugin,PluginBlock,Setting