什么是 Logstash
Logstash 是一个开源工具,它可以对你的日志进行收集、分析、并将其存储以后使用
怎么用 Logstash
安装配置
在安装之前要有 Java1.8 环境,因此先要配置 Java 环境,这点不懂可自行百度。
首先安装 Logstash,[Logstash下载地址][1]。因为我是在 Windows 下安装,因此下载的是 ZIP 版本 。下载完成后,直接解压即可。
解压完毕后,进入 bin 目录,首先要写响应的配置文件,先新建一个配置文件,pipeline.conf 配置文件主要包括三个部分,分别是 input、filter、output 分别定义了输入来源,过滤规则,输出到什么地方。一个简单地配置文件如下,从控制台输入,在输出到控制台,没有过滤规则。
input { stdin { } }
output { stdout {} }
然后执行命令 logstash agent -f pipeline.conf ,结果如下:
PS C:\ELK\logstash-2.1.0\bin> .\logstash agent -f .\pipeline.conf
io/console not supported; tty will not be manipulated
Settings: Default filter workers: 2
Logstash startup completed
表示运行成功,在命令行输入 hello world ,显示如下:
PS C:\ELK\logstash-2.1.0\bin> .\logstash agent -f .\pipeline.conf
io/console not supported; tty will not be manipulated
Settings: Default filter workers: 2
Logstash startup completed
hello world
2015-12-03T13:30:39.180Z liuyb hello world
配置语法
Logstash 设计了自己的 DSL ———— 包括有区域、注释、数据类型(布尔值、字符串、数值、数组、哈希)、条件判断、字段引用。
- 区段(section)
Logstash 用 {} 来定义区域,区域内可以包括插件区域定义,你可以在一个区域内定义多个插件,插件区域内则可以定义键值对设置。如下所示。
input{
stdin{}
syslog{}
}
数据类型
bool
debug=>true
String
host=>”hostname”
number
port=>514
array
options=>{key1=>val1,key2=>val2}
字段引用
字段是 Logstash::Event 对象的属性。我们之前提过事件就像一个哈希一样,所以你可以想象字段就想一个键值对。
如果你想在 Logstash 配置中使用字段的值,只需要把字段的名字写在中括号 [] 里就行了,这就叫做字段引用。
对于嵌套字段(也就是多维哈希表,或者叫哈希的哈希),每层的字段名都写在 [] 里就可以了。条件判断
表达式支持以下这些操作符- ==(等于), !=(不等于), <(小于), >(大于), <=(小于等于), >=(大于等于)
- =~(匹配正则), !~(不匹配正则)
- in(包含), not in(不包含)
- and(与), or(或), nand(非与), xor(非或)
- ()(复合表达式), !()(对复合表达式结果取反)
插件介绍
在 “Hello World” 示例中,我么已经见到并介绍了 Logstash 的运行流程和配置的基础语法。从这里开始我们就要逐一介绍 Logstash 流程中比较常用的一些插件,并在介绍中针对其主要适用的场景,推荐的配置,做一些说明。
配置示例中代码并不能贴完整,请记住一个原则:Logstash 配置一定要有一个 input 和一个 output。
input
collectd
collectd 是一个守护进程,用来收集系统性能和提供各种存储方式来存储不同值的机制,他会在系统运行和存储信息时周期性的统计系统相关信息。利用这些信息有助于查找当前系统性能瓶颈(如作为性能分析 performance analysis)和预测系统未来的 load(如能力部署 capacity planning)等。
collectd 的配置
以下配置可以实现对服务器基本的 CPU、内存、网卡流量、磁盘IO以及磁盘空间占用情况监控
Hostname "host.example.com"
LoadPlugin interface
LoadPlugin cpu
LoadPlugin memory
LoadPlugin network
LoadPlugin df
LoadPlugin disk
<Plugin interface>
Interface "eth0"
IgnoreSelected false
</Plugin>
<Plugin network>
<Server "10.0.0.1" "25826"> ## logstash 的 IP 地址和 collectd 的数据接收端口号
</Server>
</Plugin>
Logstash配置
以下配置实现通过 logstash 监听 25826 端口,接受从 collectd 发送过来的各项检测数据:
input {
collectd {
port => 25826 ## 端口号与发送端对应
type => collectd
}
推荐配置
udp {
port => 25826
buffer_size => 1452
workers => 3 # Default is 2
queue_size => 30000 # Default is 2000
codec => collectd { }
type => "collectd"
}
运行结果
{
"_index": "logstash-2014.12.11",
"_type": "collectd",
"_id": "dS6vVz4aRtK5xS86kwjZnw",
"_score": null,
"_source": {
"host": "host.example.com",
"@timestamp": "2014-12-11T06:28:52.118Z",
"plugin": "interface",
"plugin_instance": "eth0",
"collectd_type": "if_packets",
"rx": 19147144,
"tx": 3608629,
"@version": "1",
"type": "collectd",
"tags": [
"_grokparsefailure"
]
},
"sort": [
1418279332118
]
}
file
Logstash 使用一个名叫 FileWatch 的 Ruby Gem 库来监听文件变化。这个库支持 glob 展开文件路径,而且会记录一个叫 .sincedb 的数据库文件来跟踪被监听的日志文件的当前读取位置。所以不要担心 logstash 会漏过你的数据。
实例配置
input {
file {
path => ["/var/log/*.log", "/var/log/message"]
type => "system"
start_position => "beginning"
}
}
解释
discover_interval
logstash 每隔多久去检查一次被监听的 path 下是否有新文件,默认值是15秒
exclude
不想被监听的文件可以排除出去,这里跟 path 一样支持 glob 展开
close_older
一个已经监听中的文件,如果超过这个值的时间内没有更新内容,就关闭监听它的文件句柄。默认是 3600 秒,即一个小时
ignore_older
在每次检测文件列表的时候,如果一个文件的最后修改时间超过这个值,就忽略这个文件,默认是 86400 秒,即一天
since_path
如果你不想使用默认的$HOME/.sincedb
(Windows平台上在C:\Windows\System32\config\systemprofile.sincedb),可以通过这个配置定义 sincedb 文件到其他位置sincedb_write_interval
logstash 每隔多久写一次 sincedb 文件,默认是 15 秒
stat_interval
logstash 每隔多久检查一次被监听文件状态(是否有更新),默认是 1 秒。
- start_position
logstash 从什么位置开始读取文件数据,默认是结束位置,也就是说 logstash 进程会以类似 tail -F 的形式运行。如果你是要导入原有数据,把这个设定改成 “beginning”,logstash 进程就从头开始读取,有点类似 cat,但是读到最后一行不会终止,而是继续变成 tail -F。
stdin
配置示例
input { stdin { add_field => {"key" => "value"} codec => "plain" tags => ["add"] type => "std" } }
运行结果
用上面的 stdin 设置重新运行一次最开始的 hello world 示例。得到下面的输出:
{ "message" => "hello world", "@version" => "1", "@timestamp" => "2014-08-08T06:48:47.789Z", "type" => "std", "tags" => [ [0] "add" ], "key" => "value", "host" => "raochenlindeMacBook-Air.local" }
解释
type 和 tags 是 logstash 事件中两个特殊字段,通常来说我们会在输入区段中通过 type 来标记事件类型。而 tags 则是在数据处理过程中,有具体的插件添加或者删除的。常见用法如下:
input { stdin { type => "web" } } filter { if [type] == "web" { grok { match => ["message", %{COMBINEDAPACHELOG}] } } } output { if "_grokparsefailure" in [tags] { nagios_nsca { nagios_status => "1" } } else { elasticsearch { } } }
syslog
tcp
读取网络数据,未来你可能会使用 Redis 服务器或者其他的消息队列系统来作为 logstash broker 的角色。不过 Logstash 其实也有自己的 TCP/UDP 插件,在临时任务的时候,也算能用,尤其是在测试环境中。
配置示例
input { tcp { port => 8888 mode => "server" ssl_enable => false } }
常见场景
目前开来,LogStash::Inputs::TCP 最常见的用法就是配合 nc 命令导入旧数据。再启动 Logstash 进程后,在另一个终端运行如下命令即可导入数据。
nc 127.0.0.1 8888 < olddata
codec(编码插件)
采用 Json 编码
示例配置
input { file { path => "/var/log/nginx/access.log_json"" codec => "json" } }
合并多行数据(multiline)
有些时候,应用程序调试日志会包含非常丰富的内容,为一个时间打印出很多行内容,这种日志通常都很难通过命令行解析方式分析。
而 logstash 正为此准备好了 codec/multiline 插件示例配置
input { stdin { codec => multiline { pattern => "^\[" negate => true what => "previous" } } }
运行结果
运行 logstash 进程,然后在等待输入的终端中输入如下几行数据:[Aug/08/08 14:54:03] hello world [Aug/08/09 14:54:04] hello logstash hello best practice hello raochenlin [Aug/08/10 14:54:05] the end
你会发现 logstash 输出下面的这样的返回:
{ "@timestamp" => "2014-08-09T13:32:24.359Z", "message" => "[Aug/08/09 14:54:04] hello logstash\n\n hello best practice\n\n hello raochenlin\n", "@version" => "1", "tags" => [ [0] "multiline" ], "host" => "raochenlindeMacBook-Air.local" }
解释
其实这个插件的原理很简单,就是把当前行的数据添加到前面一行后面,指导新的当前行匹配到 ^[ 正则为止。netflow
filter(过滤器插件)
时间处理(Date)
filter/date 插件
grok
geoip
json
kv
metrics
ruby
split
elapsed
output
持续更新中。。。