专栏首页运维咖啡吧ELK日志系统之通用应用程序日志接入方案

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

前边有两篇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日志系统了,大大提高了工作的效率

本文分享自微信公众号 - 运维咖啡吧(SRE724),作者:37丫37

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-09-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ELK日志系统之使用Rsyslog快速方便的收集Nginx日志

    Rsyslog是高速的日志收集处理服务,它具有高性能、安全可靠和模块化设计的特点,能够接收来自各种来源的日志输入(例如:file,tcp,udp,uxsock等...

    37丫37
  • 中小团队基于Docker的devops实践

    工程师本地开发,开发完成后提交代码到代码仓库,[自动]触发jenkins进行持续集成与部署,部署完成会收到结果邮件。项目运行过程中可通过日志系统查看程序日志,有...

    37丫37
  • ELK构建MySQL慢日志收集平台详解

    ELK最早是Elasticsearch(以下简称ES)、Logstash、Kibana三款开源软件的简称,三款软件后来被同一公司收购,并加入了Xpark、Bea...

    37丫37
  • 转发 | IT运维分析与海量日志搜索

    1.1 从 IT Operation Management (ITOM) 到 IT Operation Analytics (ITOA)

    用户1593318
  • [喵咪BELK实战(1)]浅谈日志的重要性以及介绍BELK

    [喵咪BELK实战(1)]浅谈日志的重要性以及介绍BELK #w-blog博客 ? 前言 哈喽大家好呀!这次主要为大家带来BELK日志系统相关的博文,日志大家都...

    喵了个咪233
  • 怎么打日志

    王小明_HIT
  • MySQL常用工具、日志及读写分离

    该mysql不是值mysql服务,而是指mysql的客户端工具。 语法 : mysql [options] [database]

    海仔
  • 业务上云使用腾讯云日志服务方案

    日志服务(Cloud Log Service,下文简称CLS服务)是腾讯云提供的一站式日志数据解决方案,可以快速便捷的接入,享受日志采集、日志存储到日志内容搜索...

    覃春善
  • Java日志正确使用姿势

    关于日志,在大家的印象中都是比较简单的,只须引入了相关依赖包,剩下的事情就是在项目中“尽情”的打印我们需要的信息了。但是往往越简单的东西越容易让我们忽视,从而导...

    方丈的寺院
  • 锐捷路由技术 | syslog日志

    设备在运行过程中,会发生各种状态变化如链路状态 UP、DOWN 等,也会遇到一些事件如收到异常报文、处理异常等。锐捷产品日志提供一种机制,在状态变化或发生事件时...

    网络技术联盟站

扫码关注云+社区

领取腾讯云代金券