EFK实战二 - 日志集成
前言
在EFK基础架构中,我们需要在客户端部署Filebeat,通过Filebeat将日志收集并传到LogStash中。在LogStash中对日志进行解析后再将日志传输到ElasticSearch中,最后通过Kibana查看日志。
上文已经搭建好了EFK的基础环境,本文我们通过真实案例打通三者之间的数据传输以及解决EFK在使用过程中的一些常见问题。
首先看一下实际的业务日志
2020-01-09 10:03:26,719 INFO ========GetCostCenter Start=============== 2020-01-09 10:03:44,267 WARN 成本中心编码少于10位!{"deptId":"D000004345","companyCode":"01"} 2020-01-09 10:22:37,193 ERROR java.lang.IllegalStateException: SessionImpl[abcpI7fK-WYnW4nzXrv7w,]: can't call getAttribute() when session is no longer valid. at com.caucho.server.session.SessionImpl.getAttribute(SessionImpl.java:283) at weaver.filter.PFixFilter.doFilter(PFixFilter.java:73) at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:87) at weaver.filter.MonitorXFixIPFilter.doFilter(MonitorXFixIPFilter.java:30) at weaver.filter.MonitorForbiddenUrlFilter.doFilter(MonitorForbiddenUrlFilter.java:133)
「日志组成格式为:」
时间 日志级别 日志详情
那么我们的主要任务就是将这段日志正常写入EFK中。
filebeat安装配置
-
下载filebeat7.5.1
-
将下载后的文件上传至服务器并解压
tar -zxvf filebeat-7.5.1-linux-x86_64.tar.gz
-
修改filebeat.yml,
filebeat.inputs: - type: log enabled: true paths: - /app/weaver/Resin/log/xxx.log
此段配置日志输入,指定日志存储路径
output.logstash: # The Logstash hosts hosts: ["172.31.0.207:5044"]
此段配置日志输出,指定Logstash存储路径
-
启动filebeat
./filebeat -e -c filebeat.yml
如果需要静默启动,则使用nohup ./filebeat -e -c filebeat.yml &
命令启动即可。
logstash配置
logstash的配置主要分为三段 input
,filter
,output
。input
用于指定输入,主要是开放端口给Filebeat用于接收日志filter
用于指定过滤,对日志内容进行解析过滤。output
用于指定输出,直接配置ES的地址即可
input { beats { port => 5044 } } output { elasticsearch { hosts => ["http://172.31.0.127:9200"] index => "myindex-%{+YYYY.MM.dd}" user => "elastic" password => "xxxxxx" } }
我们配置好logstash后通过命令重启logstash
docker-compose -f elk.yml restart logstash
经过上述两步配置后应用程序往日志文件写入日志,filebeat会将日志写入logstash。在kibana查看写入的日志结果如下:
日志显示有2个问题:
-
由于错误日志堆栈信息有多行,在kibana中展示成了多行,数据查看很乱。需要将堆栈异常整理成一行显示。
-
需要对日志进行解析,拆成“时间 日志级别 日志详情”的显示格式。
优化升级
-
在filebeat中设置合并行
filebeat默认是行传输的,但是我们的日志肯定是多行一个日志,我们要把多行合并到一起就要找到日志的规律。比如我们的日志格式全都是以时间格式开头,所以我们在filebeat中filebeat.inputs
区域添加如下几行配置
# 以日期作为前缀 multiline.pattern: ^\d{4}-\d{1,2}-\d{1,2} # 开启多行合并 multiline.negate: true # 合并到上一行之后 multiline.match: after
-
在logstash中设置对日志的解析
将日志解析成“时间 日志级别 日志详情”的展示格式,所以我们需要在logstash配置文件中添加filter段
filter { grok{ match => { "message" => "(?<date>\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}),\d{3} %{LOGLEVEL:loglevel} (?<des>.*)" } } }
这里主要是使用grok语法对日志进行解析,通过正则表达式对日志进行过滤。大家可以通过kibana里的grok调试工具进行调试
配置完成后我们重新打开kibana Discover界面查看日志,符合预期,完美!
常见问题
kibana 乱码
这个主要原因还是客户端日志文件格式有问题,大家可以通过 file xxx.log
查看日志文件的编码格式,如果是ISO8859的编码基本都会乱码,我们可以在filebeat配置文件中通过encoding指定日志编码进行传输。
filebeat.inputs: - type: log enabled: true paths: - /app/weaver/Resin/log/xxx.log encoding: GB2312
kibana 提取字段出错
如上所示,打开kibana Discover面板时出现此异常,大家只要删除ES中的 .kibana_1
索引然后重新访问Kibana即可。
查看周围文件
我们在终端查看日志某关键字时一般会查上下文信息便于排查问题,如经常用到的指令 cat xxx.log | grep -C50 keyword
,那么在Kibana中如何实现这功能呢。
在Kibana中搜索关键字,然后找到具体日志记录,点击左边向下箭头,然后再点击“查看周围文档”即可实现。
动态索引
我们日志平台可能需要对接多个业务系统,需要根据业务系统建立不同的索引。
-
在filebeat中给日志打上标记
- type: log ...... fields: logType: oabusiness
-
在logstash中根据标记生成索引
input { beats { port => 5044 } } filter { if [fields][logType] == "oabusiness" { grok{ match => { "message" => "(?<date>\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}),\d{3} %{LOGLEVEL:loglevel} (?<des>.*)" } } } } output { elasticsearch { hosts => ["http://172.31.0.207:9200"] index => "%{[fields][logType]}-%{+YYYY.MM.dd}" user => "elastic" password => "elastic" } }
如果本文对你有帮助,
别忘记来个三连:
点赞,转发,评论
本文分享自微信公众号 - JAVA日知录(javadaily)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
EFK实战一 - 基础环境搭建
在分布式系统中,由于节点服务会部署多台,一旦出现线上问题需要通过日志分析定位问题就需要登录服务器一台一台进行日志检索,非常不便利,这时候就需要用到EFK日志收集工具。 在应用服务端部署Filebeat,将我们打印到日志文件中的日志发送到Logstash中,在经过Logstash的解析格式化后将日志发送到ElasticSearch中,最后通过Kibana展现出来。EFK基础版的架构如下: 本文主要是使用docker和docker-Compose部署ELK的基础环境,选择7.5.1作为EFK组件版本。 当然了如果大家对 docker,docker-compose不是很熟悉的话可以翻看我之前为大家准备的两篇文章: Docker基础与实战,看这一篇就够了 Docker-Compose基础与实战,看这一篇就够了 实在不想使用docker部署的话也可以下载对应的安装包然后手动部署,配置方式基本一样。 安装配置 elasticsearch 安装elasticsearch之前先配置如下的系统变量 修改 /etc/sysctl.conf,在最后追加如下配置 vm.max_map_count = 6553...
- 下一篇
从单元测试覆盖率看富领域模型到底有多富
从单元测试覆盖率看富领域模型到底有多富 使用了DDD(领域驱动设计)后,代码有什么不一样呢?这可能是程序员们在接触DDD后最关心的一个问题。这个系列文章会对一些优秀的DDD实例代码进行分析,管中窥豹,略见数斑。这是第一篇。 DDD中程序员最关心的部分 DDD(领域驱动设计)是一个复杂而全面的方法,编码只是最后一步。 https://github.com/ddd-crew/ddd-starter-modelling-process 但这是程序员最关心的部分,也是被问到最多的问题。 所以计划写个系列文章对一些优秀的DDD实例代码进行分析,希望能解开一些困惑。 IDDD(《实现领域驱动设计》),是最常被推荐的一本书。书中有一个关于构建Scrum管理软件的例子,我们先来分析这个经典的例子的源码(https://github.com/VaughnVernon/IDDD_Samples)。 第一篇先从单元测试和富领域模型说起。 我所目睹单元测试之怪状 关于自动化的单元测试,无数人都心怀向往。 《The Clean Coder》里边描述的测试金字塔给出了单元测试在整个测试中的位置。 经是好经,但大部...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker安装Oracle12C,快速搭建Oracle学习环境
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS关闭SELinux安全模块
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Hadoop3单机部署,实现最简伪集群