V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
37Y37
V2EX  ›  Blogger

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

  •  
  •   37Y37 · 2019-01-13 09:49:43 +08:00 · 2305 次点击
    这是一个创建于 1902 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前边有两篇 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\":\"[email protected]\",\"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 日志系统了,大大提高了工作的效率

    长按关注公众号查看更多原创文章

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

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2856 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 11:40 · PVG 19:40 · LAX 04:40 · JFK 07:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.