ELK日志系统之通用应用程序日志接入方案
前边有两篇ELK的文章分别介绍了MySQL慢日志收集和Nginx访问日志收集,那么各种不同类型应用程序的日志该如何方便的进行收集呢?且看本文我们是如何高效处理这个问题的
日志规范
规范的日志存放路径和输出格式将为我们后续的收集和分析带来极大的方便,无需考虑各种不同路径、格式的兼容问题,只需要针对固定几类日志做适配就可以了,具体的规范如下:
日志存放路径规范
- 项目日志只能输出到固定的位置,例如
/data/logs/目录下 - 同一类型(例如java web)的日志文件名保持统一,例如都叫
application.log - 一个类型的项目可以记录多个不同的日志文件,例如
exception.log和business.log
日志输出格式规范
- 日志输出必须为JSON格式,这个很重要
- 同一类型的项目应采用统一的日志输出标准,尽量将日志输出模块化,所有项目引用同一模块
- 输出日志中必须包含标准时间(timestamp)、应用名称(appname)、级别(level)字段,日志内容记录清晰易懂
日志信息级别规范
| 日志级别 | 说明 | 数值 |
|---|---|---|
| debug | 调试日志,日志信息量最多 | 7 |
| info | 一般信息日志,最常用的级别 | 6 |
| notice | 最具有重要性的普通条件信息 | 5 |
| warning | 警告级别 | 4 |
| error | 错误级别,某个功能不能正常工作 | 3 |
| critical | 严重级别,整个系统不能正常工作 | 2 |
| alert | 需要立刻修改的日志 | 1 |
| emerg | 内核崩溃等严重信息 | 0 |
从上到下级别依次从低到高,日志量从多到少,正确选择日志级别帮助后期快速排查问题
我们为什么要制定这样的规范?
- 我们的项目都跑在Docker里,Docker镜像由基础镜像+项目代码组成
- 基础镜像打包了运行项目的基础环境,例如spring cloud微服务项目,则打包了jre服务
- 规范了日志存放及输出后,我们可以把作为日志收集agent的filebeat一并打包进基础镜像,因为同一类型项目的日志路径、格式都是一致的,filebeat配置文件可以通用
- 这样我们在后续的部署过程中就不需要关心日志相关的内容,只要项目镜像引用了这个基础镜像就能自动接入了我们的日志服务,实现日志的收集、处理、存储与展示
日志采集
我们通用日志采集方案如下图:
- 程序跑在容器里,容器内自带Filebeat程序收集日志
- 收集完成后传给kafka集群,logstash读取kafka集群数据写入elasticsearch集群
- 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配置展示应用程序的日志了,方便开发及时发现问题,在线定位问题
写在最后
- 通用的基础与前提是规范,规范做好了事半功倍
- 日志打印Json格式不方便本地查看?这个可以把日志输出格式当做配置写在配置文件中,不同环境加载不同配置,就跟开发环境加载开发数据库一样
- 日志系统上线到现在稳定运行接近2年,除了刚开始有点不适应以为,都是越用越好用,现在他们已经离不开ELK日志系统了,大大提高了工作的效率
如果你觉得文章对你有帮助,请转发分享给更多的人。如果你觉得读的不尽兴,推荐阅读以下文章:
ELK日志系统之通用应用程序日志接入方案的更多相关文章
- .NET下日志系统的搭建——log4net+kafka+elk
.NET下日志系统的搭建--log4net+kafka+elk 前言 我们公司的程序日志之前都是采用log4net记录文件日志的方式(有关log4net的简单使用可以看我另一篇博客),但是随着 ...
- 03篇ELK日志系统——升级版集群之ELK日志系统整合springboot项目
[ 前言:整个ELK日志系统已经搭建好了,接下来的流程就是: springboot项目中的logback日志配置通过tcp传输,把springboot项目中所有日志数据传到————>logsta ...
- .NET基于Eleasticsearch搭建日志系统实战演练
一.需求背景介绍 1.1.需求描述 大家都知道C/S架构模式的客户端应用程序(比如:WinForm桌面应用.WPF.移动App应用程序.控制台应用程序.Windows服务等等)的日志记录都存储在本地客 ...
- 【5】基于Log4Net的日志系统
阅读目录 日志系统应具备的特性 Log4Net 配置文件:log4net.config 初始化 输出信息 对Log4Net的封装 log4net.config复杂配置 不管是Web应用程序还是W ...
- 【python】日志系统
来源: http://blog.csdn.net/wykgf/article/details/11576721 http://www.jb51.net/article/42626.htm http:/ ...
- Java日志系统框架的设计与实现
推荐一篇好的文章介绍java日志系统框架的设计的文章:http://soft.chinabyte.com/database/438/11321938.shtml 文章内容总结: 日志系统对跟踪调试.程 ...
- Android日志系统驱动程序Logger源代码分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6595744 我们知道,在Android系统中, ...
- Linux下一个简单的日志系统的设计及其C代码实现
1.概述 在大型软件系统中,为了监测软件运行状况及排查软件故障,一般都会要求软件程序在运行的过程中产生日志文件.在日志文件中存放程序流程中的一些重要信息, 包括:变量名称及其值.消息结构定义.函数返回 ...
- 配置Tomcat的日志系统
成功配置tomcat的log4j日志系统,格式:HTML+每天以yyyy-mm-dd.log命名的日志文件 一.引言: 实习单位让用log4j配置webapp的日志系统,要求产生的日志文件是html格 ...
随机推荐
- 对于java的命名规范(标识符)
java的命名规范基本都需要使用标识符来命名的: 标识符的介绍: 标识符作用: 给变量起名字的用的. 标识符的组成: 1.Unicode编码:包含大.小写字母,数字,汉字(不建议使用). 2.美元符 ...
- EntityFramework 基本模式和Code-First的简单使用
1.Database-First Database First就是首先建立好数据库,或者存在现成的数据库也可以.然后在vs中添加ADO.Net实体数据模型,找到需要的数据库和表.它是以数据库设计为基 ...
- numpy.sort()学习记录
python的功能真的是只有我想不到,没有它做不到 在学系np.sort中学到了一些 print(array2) [14 13 12 11] [10 9 8 7] [ 6 5 4 3] print(n ...
- 个人项目:实现wc.exe(Java)
本项目Github地址:https://github.com/NNewBoy/wc 项目相关要求 基本功能:(已实现) -c 统计文件字符数 -w 统计文件词的数目 -l 统计文件行数 扩展功能:(已 ...
- Dapper 嵌套对象查询
我有这样一个一对一关系的表结构:User->UserInfo User: /// <summary> /// 用户 /// </summary> [Serializabl ...
- Chrome自定义缩放百分比
我想要设置Chrome页面缩放为120%,但是Chrome只提供110% 125%,根本没有让我舒心的缩放比例. 强迫症发作,谷歌了半天没有一个很好的解决方案. 虽然也有不少第三方扩展可以自定义缩放比 ...
- BitAdminCore框架更新日志20180516
前言 经过多次的重构,目前BitAdminCore框架已经基本上稳定,近期对代码进行多次重构,让代码保持更整洁. 为促进框架的推广,更好的实现价值分享,即日起推出更新日志系列,每次更新内容进行描述. ...
- Reddit CEO亲自诠释内容审核的无奈
本文由 网易云发布. 导语:继数据泄露危机之后,Facebook将会雇用数千名新员工来负责新的验证系统,这个系统将首先在美国广告客户中生效,并将在未来几个月内涵盖其他国家.与此同时,如何让自己的社区 ...
- python scapy 网卡发包
from scapy.all import * pkt = Ether(src='11:22:33:44:55:77', dst='11:22:33:44:55:66')/ARP(op="w ...
- python web开发c6——阿里云上ubuntu+flask+gunicorn+nginx服务器部署(一)简单测试
简述 Nginx在服务器部署中的作用 请求通过Nginx实现反向代理,将请求提交给代理服务器.本文中只用了一台服务器,所以是代理到本机. gunicorn的作用 作为服务器代码的容器.接收Nginx的 ...