logstash学习笔记
文章目录
以下是学习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 程序员可能更习惯写 (?P
pattern)
- 对于 Perl 或者 Ruby 程序员应该很熟悉了,Python 程序员可能更习惯写 (?P
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” 作为字段名。
参考
文章作者 种瓜
上次更新 2016-04-16