小土刀

Logstash 入门指南

日志作为运维中非常重要的一环,往往只有在出了问题的时候才被重视起来,不同部门,不同项目的不同日志如果能够统一规范管理,对日常的开发和业务的运营都是有很大帮助的,这里我们来了解一下实时日志处理领域开源第一选择 - ELK 套餐中的 L - Logstash


更新记录

  • 2016.07.24: 初稿
  • 2016.11.19: 更新通天塔之日志分析平台系列文章链接

通天塔之日志分析平台系列文章

简介

从 Logstash 的名字就能看出,它主要负责跟日志相关的各类操作,不过在此之前,我们先来看看日志管理的三个境界吧。

境界一:『昨夜西风凋碧树。独上高楼,望尽天涯路』,在各台服务器上用传统的 linux 工具(如 cat, tail, sed, awk, grep 等)对日志进行简单的分析和处理,基本上可以认为是命令级别的操作,成本很低,速度很快,但难以复用,也只能完成基本的操作。

境界二:『衣带渐宽终不悔,为伊消得人憔悴』,服务器多了之后,分散管理的成本变得越来越多,所以会利用 rsyslog 这样的工具,把各台机器上的日志汇总到某一台指定的服务器上,进行集中化管理。这样带来的问题是日志量剧增,小作坊式的管理基本难以满足需求。

境界三:『众里寻他千百度,蓦然回首,那人却在灯火阑珊处』,随着日志量的增大,我们从日志中获取去所需信息,并找到各类关联事件的难度会逐渐加大,这个时候,就是 Logstash 登场的时候了。

Logstash 的主要优势在我看来有俩,一个是在支持各类插件的前提下提供统一的管道进行日志处理(就是 input-filter-output 这一套),二个是灵活且性能不错。

架构

Logstash 是由 JRuby 编写的,使用基于消息的简单架构,在 JVM 上运行。理念非常简单,如果说 MapReduce 框架分为 Mapper 和 Reducer 两大模块,那么 Logstash 有仨:

  1. Collect: 数据输入。对应 input
  2. Enrich: 数据处理。对应 filter
  3. Transport: 数据输出。对应 output

虽然模块仅仅比 MapReduce 框架多了一个,但是无三不成几,通过不同的拓扑结构,可以完成各类数据处理应用。不过这里我们主要还是以日志汇总处理系统的思路来进行介绍,一个典型的架构为:

图中的三个组件为 Shipper, Broker 和 Indexer,这里我们结合上图分别来进行介绍

  • Shipper 负责日志收集。职责是监控本地日志文件的变化,并输出到 Redis 缓存起来。实际部署是我们也可以考虑一些替代方案,比方说用 rsyslog 来取代 Shipper,这样就可以减少在各个服务器配置 Logstash 的工作量,也可以结合 logrotate 进行版本管理,具体方式很多,可以根据需要选择最合适的方式,切换的成本也不会特别高,只要原始日志不丢,其他都好说。
  • Broker 可以看作是日志集线器,可以连接多个 Shipper 和多个 Indexer。实际情况中是否需要采用 Redis 做存储集中,亦或是通过某台服务器来完成日志汇总,都是可以根据工作量来权衡的,不过如果对性能要求较高,可能需要接入 Redis。
  • Indexer 负责日志存储。在这个架构中会从 Redis 接收日志,写入到本地文件。因为架构比较灵活,如果不想用 Logstash 的存储,也可以对接到 Elasticsearch,这也就是前面所说的 ELK 的套路了。

一个 Logstash 进程可以有多个输入源,同时也可以有多个输出源,输入输出均支持过滤和改写,非常灵活。如果需要 Broker 的话,官方推荐 Redis,因为其支持订阅发布和队列两种模式,能够自行根据需求选用。

安装部署

Logstash 的安装也非常简单,我们先装好 JDK,配好 JAVA_HOME 即可,然后下载 Logstash 的安装包,一般来说我们会解压到 /usr/local/ 中,运行的时候执行 logstash 文件夹下 bin 文件夹的 logstash 文件即可。就是这么轻松,也就部署完成了,如果需要管理集群,可以配合 ansible 这类轻量级的配置管理工具,之后我也会具体介绍。

当然在 mac 下,可以直接 brew install logstash 即可。

简单流程

更详细的介绍会在之后的《ELK 指南》中提及,这里就简单说一下 Logstash 具体的执行吧。按照惯例,从 Hello World 开始,运行如下命令:

bin/logstash -e 'input{stdin{}}output{stdout{codec=>rubydebug}}'

然后在终端里随便输入点什么,比如说 Hello world,我们就可以看到如下结果:

# dawang at wdxtub.local in ~/Documents/Blog [7:34:06]
$ logstash -e 'input{stdin{}}output{stdout{codec=>rubydebug}}'
Settings: Default pipeline workers: 4
Pipeline main started
Hello World! I'm wdxtub
{
"message" => "Hello World! I'm wdxtub",
"@version" => "1",
"@timestamp" => "2016-07-23T23:35:27.773Z",
"host" => "wdxtub.local"
}

如果需要配置的东西比较多,还用命令行输入就比较费劲了,这时我们可以使用 .conf 文件来进行配置,再交由 logstash -f 来执行。另外我们可以把所有的配置文件放在 /etc/logstash.d/ 中,logstash 会自动读取该目录下所有 *.conf 的文本文件,然后再拼接成一个完整的大配置文件执行。

具体的命令行参数如下,这里就不再赘述了:

$ logstash -h
Usage:
/bin/logstash agent [OPTIONS]
Options:
-f, --config CONFIG_PATH Load the logstash config from a specific file
or directory. If a directory is given, all
files in that directory will be concatenated
in lexicographical order and then parsed as a
single config file. You can also specify
wildcards (globs) and any matched files will
be loaded in the order described above.
-e CONFIG_STRING Use the given string as the configuration
data. Same syntax as the config file. If no
input is specified, then the following is
used as the default input:
"input { stdin { type => stdin } }"
and if no output is specified, then the
following is used as the default output:
"output { stdout { codec => rubydebug } }"
If you wish to use both defaults, please use
the empty string for the '-e' flag.
(default: "")
-w, --pipeline-workers COUNT Sets the number of pipeline workers to run.
(default: 4)
-b, --pipeline-batch-size SIZE Size of batches the pipeline is to work in.
(default: 125)
-u, --pipeline-batch-delay DELAY_IN_MS When creating pipeline batches, how long to wait while polling
for the next event.
(default: 5)
--filterworkers COUNT DEPRECATED. Now an alias for --pipeline-workers and -w
-l, --log FILE Write logstash internal logs to the given
file. Without this flag, logstash will emit
logs to standard output.
-v Increase verbosity of logstash internal logs.
Specifying once will show 'informational'
logs. Specifying twice will show 'debug'
logs. This flag is deprecated. You should use
--verbose or --debug instead.
--quiet Quieter logstash logging. This causes only
errors to be emitted.
--verbose More verbose logging. This causes 'info'
level logs to be emitted.
--debug Most verbose logging. This causes 'debug'
level logs to be emitted.
--debug-config translation missing: en.logstash.runner.flag.debug_config (default: false)
-V, --version Emit the version of logstash and its friends,
then exit.
-p, --pluginpath PATH A path of where to find plugins. This flag
can be given multiple times to include
multiple paths. Plugins are expected to be
in a specific directory hierarchy:
'PATH/logstash/TYPE/NAME.rb' where TYPE is
'inputs' 'filters', 'outputs' or 'codecs'
and NAME is the name of the plugin.
-t, --configtest Check configuration for valid syntax and then exit.
--[no-]allow-unsafe-shutdown Force logstash to exit during shutdown even
if there are still inflight events in memory.
By default, logstash will refuse to quit until all
received events have been pushed to the outputs. (default: false)
-r, --[no-]auto-reload Monitor configuration changes and reload
whenever it is changed.
NOTE: use SIGHUP to manually reload the config
(default: false)
--reload-interval RELOAD_INTERVAL How frequently to poll the configuration location
for changes, in seconds.
(default: 3)
--allow-env EXPERIMENTAL. Enables templating of environment variable
values. Instances of "${VAR}" in strings will be replaced
with the respective environment variable value named "VAR".
(default: false)
-h, --help print help

疑难杂症

Logstash 的字段中不能出现 . 这个问题,可以通过 de_dot 这个插件解决,安装命令 bin/logstash-plugin install logstash-filter-de_dot,然后在 logstash 的配置文件中添加如下一段代码即可。

filter {
de_dot { }
}

小结

更多关于 Logstash 的内容可以在 ELKstack 中文指南 查阅,只要明白了基本的套路,剩下的就是根据业务需求不断实践了,不过这里再说两点:

  • 插件的使用类似于 Rails 中 Gemfile 的表现,都是利用 Ruby 强大的 DSL 实现的
  • 配置文件的语法不算复杂,但是有些东西比较细,需要测试后再投入使用

参考链接

您的支持是对我创作最大的鼓励!

热评文章