logstash学习笔记一

每位系统管理员都肯定写过很多类似这样的命令: cat randdata | awk '{print $2}' | sort | uniq -c | tee sortdata 。这个管道符 | 可以算是 Linux 世界最伟大的发明之一(另一个是“一切皆文件”)。

Logstash 就像管道符一样!

你输入(就像命令行的cat)数据,然后处理过滤(就像awk或者uniq之类) 数据,最后输出(就像tee)到其他地方。当然实际上,Logstash是用不同的线程来实现这些的。如果你运行top命令然 后按下H键,你就可以看到下面这样的输出:PIDUSERPRNIVIRTRESSHRS%CPU%MEMTIME+COM MAND21401root1601249m303m10mS18.60.2866:25.46|wo rker21467root1501249m303m10mS3.70.2129:25.59>el asticsearch.21468root1501249m303m10mS3.70.2128:53.39>el asticsearch.21400root1501249m303m10mS2.70.2108:35.80ou tput 21470 root 15 0 1249m 303m 10m S 1.0 0.2 56:24.24 >el asticsearch.

小贴士:logstash 很温馨的给每个线程都取了名字,输入的叫xx,过滤的叫|xx

数据在线程之间以 事件 的形式流传。不要叫行,因为 logstash 可以处理多行事 件。

Logstash 会给事件添加一些额外信息。最重要的就是 @timestamp,用来标记事 件的发生时间。因为这个字段涉及到 Logstash 的内部流转,所以必须是一个 joda 对象,如果你尝试自己给一个字符串字段重命名为 @timestamp 的话,Logstash 会直接报错。所以,请使用 filters/date 插件 来管理这个特殊字段。

此外,大多数时候,还可以见到另外几个:

1. host 标记事件发生在哪里。

 2. type 标记事件的唯一类型。

 3. tags 标记事件的某方面属性。

这是一个数组,一个事件可以有多个标签。 你可以随意给事件添加字段或者从事件里删除字段。事实上事件就是一个 Ruby 对 象,或者更简单的理解为就是一个哈希也行。

:每个 logstash 过滤插件,都会有四个方法叫 add_tag , remove_tag , add_field 和 remove_field 。它们在插件过滤匹配成功时生效。


不过我见过很多运用场景里都没有用 logstash 作为 shipper,或者说没有用 elasticsearch 作为数据存储也就是说也没有 indexer。所以,我们其实不需要这些 概念。只需要学好怎么使用和配置 logstash 进程,然后把它运用到你的日志管理架 构中最合适它的位置就够了。

区段(section)

Logstash 用 {} 来定义区域。区域内可以包括插件区域定义,你可以在一个区域 内定义多个插件。插件区域内则可以定义键值对设置。示例如下:


数据类型

Logstash 支持少量的数据值类型:

bool

debug => true

string

host => "hostname"

number

port => 514

array

match => ["datetime", "UNIX", "ISO8601"]

hash

options => { key1 => "value1", key2 => "value2" }

字段引用(field reference)

字段是 Logstash::Event 对象的属性。我们之前提过事件就像一个哈希一样, 所以你可以想象字段就像一个键值对。

小贴士:我们叫它字段,因为 Elasticsearch 里是这么叫的。

如果你想在 Logstash 配置中使用字段的值,只需要把字段的名字写在中括号 [] 里就行了,这就叫字段引用。

对于 嵌套字段(也就是多维哈希表,或者叫哈希的哈希),每层的字段名都写在 [] 里就可以了。比如,你可以从 geoip 里这样获取 longitude 值(是的,这是个笨办 法,实际上有单独的字段专门存这个数据的):

[geoip][location][0]

小贴士:logstash 的数组也支持倒序下标,即 [geoip][location][-1] 可以获 取数组最后一个元素的值。

Logstash 还支持变量内插,在字符串里使用字段引用的方法是这样:

"the longitude is %{[geoip][location][0]}"

条件判断(condition)

Logstash从 1.3.0 版开始支持条件判断和表达式。

表达式支持下面这些操作符:

== (等于), != (不等于), < (小于), > (大于), <= (小于等于), >= (大于等 于) =~ (匹配正则), !~ (不匹配正则) in (包含), not in (不包含) and (与), or (或), nand(非与), xor(非或) () (复合表达式), !() (对复合表达式结果取反)

配置语法

20

通常来说,你都会在表达式里用到字段引用。为了尽量展示全面各种表达式,下面 虚拟一个示例:

if "_grokparsefailure" not in [tags] { } else if [status] !~ /^2\d\d/ or ( [url] == "/noc.gif" nand [ge oip][city] != "beijing" ) { } else { }

命令行参数

Logstash 提供了一个 shell 脚本叫 logstash 方便快速运行。它支持以下参数:

-e

意即执行。我们在 "Hello World" 的时候已经用过这个参数了。事实上你可以不写 任何具体配置,直接运行 bin/logstash -e '' 达到相同效果。这个参数的默认 值是下面这样:

input { stdin { } } output { stdout { } }

--config 或 -f

意即文件。真实运用中,我们会写很长的配置,甚至可能超过 shell 所能支持的 1024 个字符长度。所以我们必把配置固化到文件里,然后通过 bin/logstash -f agent.conf 这样的形式来运行。

此外,logstash 还提供一个方便我们规划和书写配置的小功能。你可以直接用 bin/logstash -f /etc/logstash.d/ 来运行。logstash 会自动读取 /etc/logstash.d/ 目录下所有 *.conf 的文本文件,然后在自己内存里拼接 成一个完整的大配置文件,再去执行。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 每个 logstash 过滤插件,都会有四个方法叫add_tag,remove_tag,add_field和rem...
    g0阅读 1,125评论 0 6
  • Logstash使用配置 运行:bin/logstash -f /home/logstash.conf logst...
    会飞的鱼Coo阅读 40,834评论 2 10
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,027评论 19 139
  • 我们大部分的人都是平凡的人,每天周而复始地过着属于自己的小日子,但是我们依旧会有着属于平凡人的梦想,里面燃烧着属于...
    Kitty_菁彩人生阅读 473评论 8 8
  • 初冬的夜晚说来就来,悄无声息,下班回家时已是华灯初上。一出办公室门就感到丝丝寒意,下意识地裹紧衣服,小步慢跑起来。...
    千禾随笔阅读 2,098评论 23 57