EFK 实战二 - 日志集成

本贴最后更新于 1656 天前,其中的信息可能已经时过境迁

前言

在 EFK 基础架构中,我们需要在客户端部署 Filebeat,通过 Filebeat 将日志收集并传到 LogStash 中。在 LogStash 中对日志进行解析后再将日志传输到 ElasticSearch 中,最后通过 Kibana 查看日志。

上文 EFK 实战一 - 基础环境搭建已经搭建好了 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 的配置主要分为三段 inputfilteroutput
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 查看写入的日志结果如下:
image.png

日志显示有 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 调试工具进行调试
image.png

配置完成后我们重新打开 kibana Discover 界面查看日志,符合预期,完美!
image.png

常见问题

kibana 乱码

这个主要原因还是客户端日志文件格式有问题,大家可以通过 file xxx.log 查看日志文件的编码格式,如果是 ISO8859 的编码基本都会乱码,我们可以在 filebeat 配置文件中通过 encoding 指定日志编码进行传输。

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /app/weaver/Resin/log/xxx.log
  encoding: GB2312

kibana 提取字段出错

image.png

如上所示,打开 kibana Discover 面板时出现此异常,大家只要删除 ES 中的 .kibana_1 索引然后重新访问 Kibana 即可。
image.png

查看周围文件

我们在终端查看日志某关键字时一般会查上下文信息便于排查问题,如经常用到的指令 cat xxx.log | grep -C50 keyword,那么在 Kibana 中如何实现这功能呢。
image.png

在 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"
	}
}

好了,各位朋友们,本期的内容到此就全部结束啦,能看到这里的同学都是优秀的同学,下一个升职加薪的就是你了!
如果觉得这篇文章对你有所帮助的话请扫描下面二维码加个关注。"转发" 加 "在看",养成好习惯!咱们下期再见!

image.png

  • ELK
    23 引用 • 18 回帖
  • 运维

    互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够 7×24 小时为用户提供高质量的服务。

    148 引用 • 257 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...