简介
由于公司没有日志收集系统,所以之前搭建了一个ELK日志收集分析系统,如此一来查询日志就方便了很多,再加上ELK的一些方便实用的索引分析功能,可以将数据已图表形式展现,一目了然。
网上好多都是采用了ELK+redis的架构,但考虑到目前公司业务不是很多,所以没有加入redis一层
ELK的安装请参考我上一篇文章 ELK环境搭建
日志收集配置
其实你的ELK系统搭建完成以后,剩下的主要就是logstash收集配置的编写以及整个系统的性能调优了,性能调优后续在写。
这里会逐步说明配置的一些含义,后面会将完整配置贴出。
nginx日志是自定义的格式,所以需要用logstash将message格式化存储到ES中,这里采用grok过滤器,使用match正则表达式解析,根据自己的log_format定制。
- nginx日志
- nginx中log_format的配置
|
|
- 输出的日志
|
|
- 编写正则表达式
这里可以借助grop官网的debugger和patterns来快速帮助我们写正则表达式
对应上面输出的日志,我写的正则表达式如下
|
|
在grop官网的debugger解析结果如下
|
|
- 地理坐标分析-geoip
- 安装geoip数据库
|
|
- 配置logstash使用GeoIP
只需要在filter里配置即可
|
|
- GeoIP使用注意事项
如果你出现下面的错误
报错No Compatible Fields: The “[nginx-access-]YYYY-MM” index pattern does not contain any of the following field types: geo_point
原因:索引格式为[nginx-access-]YYYY-MM的日志文件由logstash输出到Elasticsearch;在 elasticsearch 中,所有的数据都有一个类型,什么样的类型,就可以在其上做一些对应类型的特殊操作。geo信息中的location字段是经纬度,我们需要使用经纬度来定位地理位置;在 elasticsearch 中,对于经纬度来说,要想使用 elasticsearch 提供的地理位置查询相关的功能,就需要构造一个结构,并且将其类型属性设置为geo_point,此错误明显是由于我们的geo的location字段类型不是geo_point。
解决方法:Elasticsearch 支持给索引预定义设置和 mapping(前提是你用的 elasticsearch 版本支持这个 API,不过估计应该都支持)。其实ES中已经有一个默认预定义的模板,我们只要使用预定的模板即可,我们在ES中看下模板。简而言之就是output的index名称,必须以logstash-
开头
|
|
logstash完整配置文件
|
|
ES数据查看
到此,就可以在ES中查看具体解析出来的数据是什么样子的了
进入http://你的IP:PORT/_plugin/head/
,点击数据浏览
,找到你的nginx索引,选一条点击查看生成的索引原始数据:
|
|
kibana图表生成分析
注意事项
- logstash在启动时报错:默认是4个线程,但是只能创建一个线程。
这是同一个log4j_to_es.conf
配置了多个input-file
并且配置了multiline
后出现的问题,应该把multiline
配置从filter中移动到input中去:
|
|
- 在kibana中无法选择geoip以及userAgent的字段
解决办法:进入kibana-settings-indices,点击你的索引,然后点击刷新按钮即可