oral,ELK的装置及运用,福尔摩斯探案集

频道:最近大事件 日期: 浏览:273

ELK 是 ElasticSearch + Logstash + Kibana 这套组合东西的简称,是一个常用的日志体系。

  • ElasticSearch:是一款开源的根据 Lucene 之上完结的一个分布式查找引擎,也是一个存储引擎(例如:日志),它的特色有:分布式、零装备、主动发现、索引主动分片、索引副本机制、Restful 风格的接口、多数据源和主动查找负载等。
  • Logstash:是一款开源的日志搜集东西,它能够对日志进行搜集、剖析、过滤,并将其存储(例如:ElasticSearch)起来供今后运用。
  • Kibana:是一款开源的可视化东西,可认为 ElasticSearch 供给的日志剖析友爱的 Web 界面,能够汇总、剖析和查找重要的数据日志。

装置 ELK

咱们运用 Docker 装置 ELK,运转如下指令:

$ docker run -p 5601:5601 \
-p 9200:9200 \
-p 5044:5044 \
-p 15044:15044/udp \
-it --name elk sebp/elk

进入容器:

$ docker exec -it elk /bin/bash

运转以下指令设置 logstash 的 input 和 output:

# /opt/logstash/bin/logstash --path.data /tmp/logstash/data \
-e 'input { udp { codec => "json" port => 15044 } } output { elasticsearch { hosts => ["localhost"] } }'

这儿咱们发动一个 15044 的 UDP 端口,用来接纳经过 UDP 发送到 Logstash 的日志。

用浏览器翻开 localhost:5601,如下所示:

现在还没有指定 index(ElasticSearch 的 index 类似于 MySQL/MongoDB 中的 database),即日志来历。下面咱们测验向 ELK 中写入一些日志。

运用 ELK

这儿以运用 koa-await-breakpoint 为例,来演示如何将日志发送到 ELK。

app.js

const koaAwaitBreakpoint = require('koa-await-breakpoint')({
name: 'api',
files: ['./routes/*.js'],
store: require('./logger')
})
const Paloma = require('paloma')
const app = new Paloma()
app.use(koaAwaitBreakpoint)
app.route({ method: 'POST', path: '/users', controller: require('./routes/user').createUser })
app.listen(3000)

logger.js

const Logstash = require('logstash-client')
const logstash = new Logstash({
type: 'udp',
host: 'localhost',
port: 15044
})
module.exports = {
save (log) {
if (log.error) {
log.errMsg = log.error.message
log.errStack = log.error.stack
}
logstash.send(log)
}
}

routes/user.js

const Mongolass = require('mongolass')
const mongolass = new Mongolass('mongodb://localhost:27017/test')
const User = mongolass.model('User')
const Post = mongolass.model('Post')
const Comment = mongolass.model('Comment')
exports.createUser = async function (ctx) {
const name = ctx.query.name || 'default'
const age = +ctx.query.age || 18
await createUser(name, age)
ctx.status = 204
}
async function createUser (name, age) {
const user = (await User.create({
name,
age
})).ops[0]
await createPost(user)
}
async function createPost (user) {
const post = (await Post.create({
uid: user._id,
title: 'post',
content: 'post'
})).ops[0]
await createComment(user, post)
}
async function createComment (user, post) {
await Comment.create({
userId: user._id,
postId: post._id,
content: 'comment'
})
}

运转:

$ curl -XPOST localhost:3000/users

此刻改写 Kibana,如下所示:

在初度运用 Kibana 时,需求装备 Kibana 从 ElasticSearch 的哪些 index 中查找日志,咱们在 Index pattern 处填 logstash-*,然后单击 Next step 按钮,在 Time Filter field name 中挑选 timestamp,单击 Create index pattern 完结装备。

留意:咱们挑选 timestamp 而不是默许的 @timestamp,是因为在 koa-await-breakpoint 的日志中有 timestamp 字段。

单击左边目录的 Discover,咱们发现已经有日志了。别离单击左边呈现的 Available Fields 的 fn、type、step、take,然后按 step 升序展现,如下所示:

是不是一望而知!咱们把每个恳求的每一步的函数及其执行时间都记录下来了。

修正 routes/users.js 的 createComment,throw 一个 new Error('test')。重启程序并建议一个恳求,ELK 显现如下:

小提示:在实践运用中会有十分多的日志,咱们能够经过 requestId 找到一个恳求的一切日志,在 7.2 末节会解说。

ELK 十分强壮,基本能满意一切日志查询需求,Kibana 的查询运用 lucene 语法,用 10 分钟左右就能大体上手。Kibana 还能创立各种仪表盘和聚合图表,读者可自行测验。

热门
最新
推荐
标签