最近二期开始上线了,一直没顾上写博客,今天忙里偷闲写一篇关于logstash的,项目引入elk有半年多了,由于日志记录的错综复杂.之前解析都是通过ruby进行字符串分割实现,但是这个月对日志记录这块做了调整,全部采用json方式记录.这样一来logstash解析日志这块就的重新实现.json嵌套了2层,如果直接用json进行格式化,es中会有冗余字段,所以只能人工解析json,话不多说直接看过程
logstash中ruby这块网上案例并不多,查了半天也没有什么收获,官网上给了一句
可以执行任意ruby代码.可是真正去实现的时候踩了不少吭,诸多报错. 第一步调用ruby脚本的时候就一直提示"Script does not define a filter! Please ensure that you have defined a filter method!,根本不加载指定的函数.翻阅logstash-filter-ruby源码得知
其方法中必须有filter函数,固将函数名称更改成filter后解决,但是后续提示没有定义event ,继续翻阅源码看到这个
在调用自定义ruby脚本的时候将event传递过去了.于是将event更改成参数传递解决.最终生产配置如下:
ruby中String和json转换关系如下:
String--->JSON JSON.parse String
JSON--->String JSON.to_json
定义方法如下:
def filter(event)
#取出日志信息
logdata=event.get('message')
if (logdata.include?'reqMessage' )
#解析日志级别和请求时间,并保存到event对象中
logleve=logdata[(logdata.index('[')+1)...logdata.index(']')]
event.set('logleve',logleve)
event.set('requestTime',logdata[0,logdata.index(' - [')])
#如果是rest接口json日志
if(logdata.include?'restJson')
parseJsonLog event,logdata
else
parseXmlLog event,logdata
end
end
return [event]
#解析json格式日志
def parseJsonLog(event,logdata)
#获取日志内容
loginfo=logdata[(logdata.index('] ')+2)...(logdata.rindex('}')+1)]
#转成json对象
logInfoJson=JSON.parse loginfo
#获取流水号
event.set('transactionID',logInfoJson['transactionID'])
event.set('channel',logInfoJson['reqMessage']['channel'])
#获取返回报文
event.set('respMessage',logInfoJson['respMessage'].to_json)
#获取请求报文
event.set('reqMessage',logInfoJson['reqMessage'].to_json)
.....................省略部分代码
#设置标示位
event.set('tags','log_success')
end
ruby插件确实不错,可以随意实现日志解析,相比与正则和直接logstash中的json插件要方便灵活的多.推荐使用logstash中的ruby脚本解析日志.希望此篇博客可以帮忙到诸多新接触elk的朋友们,再有就是得到领悟阅读源码确实可以得到不一样的理解和见解.我们不管要知其然,还要知其所以然