前边有两篇ELK的文章分别介绍了MySQL慢日志收集和Nginx访问日志收集,那么各种不同类型应用程序的日志该如何方便的进行收集呢?且看本文我们是如何高效处理这个问题的
规范的日志存放路径和输出格式将为我们后续的收集和分析带来极大的方便,无需考虑各种不同路径、格式的兼容问题,只需要针对固定几类日志做适配就可以了,具体的规范如下:
日志存放路径规范
/data/logs/
目录下application.log
exception.log
和business.log
日志输出格式规范
日志信息级别规范
日志级别 | 说明 | 数值 |
---|---|---|
debug | 调试日志,日志信息量最多 | 7 |
info | 一般信息日志,最常用的级别 | 6 |
notice | 最具有重要性的普通条件信息 | 5 |
warning | 警告级别 | 4 |
error | 错误级别,某个功能不能正常工作 | 3 |
critical | 严重级别,整个系统不能正常工作 | 2 |
alert | 需要立刻修改的日志 | 1 |
emerg | 内核崩溃等严重信息 | 0 |
从上到下级别依次从低到高,日志量从多到少,正确选择日志级别帮助后期快速排查问题
我们通用日志采集方案如下图:
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配置展示应用程序的日志了,方便开发及时发现问题,在线定位问题