ELK 日志系统之通用应用程序日志接入方案

2019-01-13 09:49:43 +08:00
 37Y37

前边有两篇 ELK 的文章分别介绍了MySQL 慢日志收集Nginx 访问日志收集,那么各种不同类型应用程序的日志该如何方便的进行收集呢?且看本文我们是如何高效处理这个问题的

日志规范

规范的日志存放路径和输出格式将为我们后续的收集和分析带来极大的方便,无需考虑各种不同路径、格式的兼容问题,只需要针对固定几类日志做适配就可以了,具体的规范如下:

日志存放路径规范

  1. 项目日志只能输出到固定的位置,例如/data/logs/目录下
  2. 同一类型(例如 java web )的日志文件名保持统一,例如都叫application.log
  3. 一个类型的项目可以记录多个不同的日志文件,例如exception.logbusiness.log

日志输出格式规范

  1. 日志输出必须为 JSON 格式,这个很重要
  2. 同一类型的项目应采用统一的日志输出标准,尽量将日志输出模块化,所有项目引用同一模块
  3. 输出日志中必须包含标准时间( timestamp )、应用名称( appname )、级别( level )字段,日志内容记录清晰易懂

日志信息级别规范

日志级别 | 说明 | 数值 ---|---|--- debug | 调试日志,日志信息量最多 | 7 info | 一般信息日志,最常用的级别 | 6 notice | 最具有重要性的普通条件信息 | 5 warning | 警告级别 | 4 error | 错误级别,某个功能不能正常工作 | 3 critical | 严重级别,整个系统不能正常工作 | 2 alert | 需要立刻修改的日志 | 1 emerg | 内核崩溃等严重信息 | 0

从上到下级别依次从低到高,日志量从多到少,正确选择日志级别帮助后期快速排查问题

我们为什么要制定这样的规范?

  1. 我们的项目都跑在 Docker 里,Docker 镜像由基础镜像+项目代码组成
  2. 基础镜像打包了运行项目的基础环境,例如 spring cloud 微服务项目,则打包了 jre 服务
  3. 规范了日志存放及输出后,我们可以把作为日志收集 agent 的 filebeat 一并打包进基础镜像,因为同一类型项目的日志路径、格式都是一致的,filebeat 配置文件可以通用
  4. 这样我们在后续的部署过程中就不需要关心日志相关的内容,只要项目镜像引用了这个基础镜像就能自动接入了我们的日志服务,实现日志的收集、处理、存储与展示

日志采集

我们通用日志采集方案如下图:

  1. 程序跑在容器里,容器内自带 Filebeat 程序收集日志
  2. 收集完成后传给 kafka 集群,logstash 读取 kafka 集群数据写入 elasticsearch 集群
  3. kibana 读取 elasticsearch 集群数据展示在 web 上,开发、运维等需要查看日志的用户登录 kibana 查看

Client 端 Filebeat 配置

filebeat.prospectors:

- input_type: log
  paths:
    - /home/logs/app/business.log
    - /home/logs/app/exception.log

  json.message_key: log
  json.keys_under_root: true

output.kafka:
  hosts: ["10.82.9.202:9092","10.82.9.203:9092","10.82.9.204:9092"]
  topic: filebeat_docker_java

Kafka 接收到的数据格式

{"@timestamp":"2018-09-05T13:17:46.051Z","appname":"app01","beat":{"hostname":"52fc9bef4575","name":"52fc9bef4575","version":"5.4.0"},"classname":"com.domain.pay.service.ApiService","date":"2018-09-05 21:17:45.953+0800","filename":"ApiService.java","hostname":"172.17.0.2","level":"INFO","linenumber":285,"message":"param[{\"email\":\"TEST@163.COM\",\"claimeeIP\":\"123.191.2.75\",\"AccountName\":\"\"}]","source":"/home/logs/business.log","thread":"Thread-11","timestamp":1536153465953,"type":"log"}

Server 端 Logstash 配置

input {
    kafka {
        bootstrap_servers => "10.82.9.202:9092,10.82.9.203:9092,10.82.9.204:9092"
        topics => ["filebeat_docker_java"]
    }
}

filter {
    json {
        source => "message"
    }

    date {
        match => ["timestamp","UNIX_MS"]
        target => "@timestamp"
    }
}

output {
    elasticsearch {
        hosts => ["10.82.9.205", "10.82.9.206", "10.82.9.207"]
        index => "filebeat-docker-java-%{+YYYY.MM.dd}"
    }
}

都是基础配置很简单,不做过多解释,通过以上简单的配置就能实现任何应用程序的日志收集

日志展示

收集日志到 elasticsearch 之后,就可以通过 kibana 配置展示应用程序的日志了,方便开发及时发现问题,在线定位问题

写在最后

  1. 通用的基础与前提是规范,规范做好了事半功倍
  2. 日志打印 Json 格式不方便本地查看?这个可以把日志输出格式当做配置写在配置文件中,不同环境加载不同配置,就跟开发环境加载开发数据库一样
  3. 日志系统上线到现在稳定运行接近 2 年,除了刚开始有点不适应以为,都是越用越好用,现在他们已经离不开 ELK 日志系统了,大大提高了工作的效率

如果你觉得文章对你有帮助,请转发分享给更多的人。如果你觉得读的不尽兴,推荐阅读以下文章:

2318 次点击
所在节点    Blogger
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/526500

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX