3

logstash学习笔记

 2 years ago
source link: http://wwj718.github.io/post/%E5%B7%A5%E5%85%B7/logstash-note/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

以下是学习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 则是在数据处理过程中,由具体的插件来添加或者删除的。
  • 但 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)

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

  • ISO8601
    • 类似 “2011-04-19T03:44:01.103Z” 这样的格式
  • 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” 作为字段名。

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK