以下是学习Kibana时做的笔记

优点

  • Elasticsearch 全部采用 JSON 接口,Logstash 是 Ruby DSL 设计,都是目前业界最通用的配置语法设计
  • 不管是 Elasticsearch 集群还是 Logstash 集群都是可以线性扩展的;

理解

把它理解为管道

知识点

  • Logstash 会给事件添加一些额外信息。最重要的就是 @timestamp,用来标记事件的发生时间。因为这个字段涉及到 Logstash 的内部流转
  • 大多数时候,还可以见到另外几个:
    • host 标记事件发生在哪里。
    • type 标记事件的唯一类型。
    • tags 标记事件的某方面属性。这是一个数组,一个事件可以有多个标签。
  • 你可以随意给事件添加字段或者从事件里删除字段。事实上事件就是一个 Ruby 对象,或者更简单的理解为就是一个哈希也行。
  • 插件机制
    • 输入插件(Input):input是个插件

input

###file

  • Logstash 使用一个名叫 FileWatch 的 Ruby Gem 库来监听文件变化。这个库支持 glob 展开文件路径,而且会记录一个叫 .sincedb 的数据库文件来跟踪被监听的日志文件的当前读取位置。所以,不要担心 logstash 会漏过你的数据。
  • FileWatch 只支持文件的绝对路径
  • 默认15秒刷新一次更新
  • /path/to/**/*.log,用 ** 来缩写表示递归全部子目录
  • 最简单的输入输出,stdin.html,便于做实验
  • type 和 tags 是 logstash 事件中两个特殊的字段。通常来说我们会在输入区段中通过 type 来标记事件类型 —— 我们肯定是提前能知道这个事件属于什么类型的。而 tags 则是在数据处理过程中,由具体的插件来添加或者删除的。

tcp

  • 但 Logstash 本身只能在 SizedQueue 中缓存 20 个事件。这就是我们建议在生产环境中换用其他消息队列的原因。
  • 最常见的用法就是配合 nc 命令导入旧数据
  • 这种做法比用 LogStash::Inputs::File 好,因为当 nc 命令结束,我们就知道数据导入完毕了。而用 input/file 方式,logstash 进程还会一直等待新数据输入被监听的文件,不能直接看出是否任务完成了。

codec

Logstash 不只是一个input | filter | output 的数据流,而是一个 input | decode | filter | encode | output 的数据流!codec 就是用来 decode、encode 事件的。

过滤器插件(Filter)

data

filters/date 插件支持五种时间格式

  • ISO8601
    • 类似 “2011-04-19T03:44:01.103Z” 这样的格式
  • UNIX
  • UNIX_MS
    • JavaScript 里经常使用这个时间格式

时区问题的解释

为什么 @timestamp 比我们早了 8 个小时?怎么修改成北京时间?
Elasticsearch 内部,对时间类型字段,是统一采用 UTC 时间,对于页面查看,ELK 的解决方案是在 Kibana 上,读取浏览器的当前时区,然后在页面上转换时间内容的显示。建议大家接受这种设定


Grok 正则捕获

Grok 是 Logstash 最重要的插件。你可以在 grok 里预定义好命名正则表达式,在稍后引用它。

  • \s+(?<request_time>\d+(?:\.\d+)?)\s+
    • 对于 Perl 或者 Ruby 程序员应该很熟悉了,Python 程序员可能更习惯写 (?Ppattern)

JSON 编解码

有些日志可能是一种复合的数据结构,其中只是一部分记录是 JSON 格式的。这时候,我们依然需要在 filter 阶段,单独启用 JSON 解码插件

##随心所欲的 Ruby 处理 通常我们都是用 filters/grok 插件来捕获字段的,正则耗费大量的 CPU 资源。 很多流经 Logstash 的数据都是有自己预定义的特殊分隔符的,我们可以很简单的直接切割成多个字段。

output

保存进 Elasticsearch:这节是匹配最新版本的

  • flush_size 和 idle_flush_time 共同控制 Logstash 向 Elasticsearch 发送批量数据的行为。以上面示例来说:Logstash 会努力攒到 20000 条数据一次性发送出去,但是如果 10 秒钟内也没攒够 20000 条,Logstash 还是会以当前攒到的数据量发一次。
  • logstash能向远方机器发送log
  • 注意索引名中不能有大写字母

模板

  • Elasticsearch 支持给索引预定义设置和 mapping。Logstash 自带有一个优化好的模板,默认模板的"template" 为"logstash-*"
  • Elasticsearch 是一个近实时搜索引擎。它实际上是每 1 秒钟刷新一次数据。对于日志分析应用,我们用不着这么实时,所以 logstash 自带的模板修改成了 5 秒钟
  • 这种类型会自动添加一个 “.raw” 结尾的字段,并给这个字段设置为不启用分词器。简单说,你想获取 url 字段的聚合结果的时候,不要直接用 “url” ,而是用 “url.raw” 作为字段名。

参考