Logstash简介
https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html
https://www.kancloud.cn/aiyinsi-tan/logstash/849518
Logstash Introduction
Logstash 是一个实时的管道式开源日志收集引擎。Logstash可以动态的将不同来源的数据进行归一并且将格式化的数据存储到你选择的位置。对你的所有做数据清洗和大众化处理,以便做数据分析和可视化。
我们对Logstash的日志收集做了大量的创新,但它的能力远不止收集日志这么简单。通过输入、过滤和输出插件Logstash可以对任何类型的事件丰富和转换,通过本地编码器还可以进一步简化此过程。Logstash通过大量的多样化数据来提升你的洞察力。
The Power of Logstash
Elasticsearch或其他更多应用的收集器
水平可扩展的数据处理管道和强大的Elasticsearch、Kibana组合协同工作。
插件式架构
混合、匹配和编排不同的输入、过滤器和输出,以便在管道协调中发挥作用。(原文:Mix, match, and orchestrate different inputs, filters, and outputs to play in pipeline harmony。个人认为其含义应该为:在输入、过滤、输出的管道中协调混合、过滤和匹配。)
Community-extensible and developer-friendly plugin ecosystem
超过200个可用插件,加上你自己创造和贡献的灵活性。(根据标题的意思应该是要表达可以根据需要自己灵活创建插件,原文如下:Over 200 plugins available, plus the flexibility of creating and contributing your own)
static/images/logstash.png
Analysis:分析
Archiving:归档
Monitoring:监控
Alerting:报警
Logstash Loves Data
收集越多知道的越多,Logstash欢迎任意形式和大小的数据。
Logs and Metrics(日志和指标)
一切从哪里开始。
处理所有类型的日志数据
轻松收集大量web日志如:Apache,和应用程序日志如:log4j for java
捕获许多其他日志格式如:syslog,网络和防火墙日志,以及更多类型
享受和Filebeat互补的安全的日志转发能力。
通过TCP和UDP从Ganglia,collectd,NetFlow,JMX和其他众多的基础架构和应用平台收集指标。
The Web
Unlock the World Wide Web.
将HTTP requests转换成事件
如Twitter用来做社会感情分析(只翻译了后半句,前半句实在整不出来啥意思。原文:Consume from web service firehoses like Twitter for social sentiment analysis)
支持GitHub,HipChat,JIRA和无数其他应用程序的Webhook。
启用多个监控报警用例(原文:Enables many Watcher alerting use cases)
按需轮询 HTTP endpoints来创建事件
从网络应用程序接口捕获健康、性能、指标等其他类型的数据。
Perfect for scenarios where the control of polling is preferred over receiving。(不会,大意是说他的最佳使用场景。)
Data Stores and Streams
发掘你的数据的更多价值。
使用JDBC接口从任何关系型或非关系型数据库存储总更好的理解你的数据。
从消息队列中统一不同的数据流。如:Kafka,RabbitMQ,Amazor SQS
Sensors and loT
探索其他更广泛的数据
在这个技术大爆炸的时代,通过获取和分析连接在这个庞大的物联网世界上的传感器获取的数据释放了无数的用例。
从移动设备到智能家庭、车联网、健康传感器以及其他的行业应用,Logstash也是最常见的事件收集器支柱。
Easily Enrich Everything
更好的数据意味着更好的知识。通过清洗和转换数据来提升实时洞察数据的能力。Logstash提供了许多聚合和转换以及模式匹配、地理映射和动态查找功能。
Grok是Logstash基本的过滤器,被广泛的用于将非结构化的数据结构化。享受其为致力于快速解决Web、System、Networking和其他类型的事件格式附带的丰富的集成模式,
扩展你的视野通过从IP地址解析地理坐标,将复杂的日期规范化展示,简化K/V数据和CSV数据,指纹(匿名)敏感信息。并进一步从本地或Elasticsearch查询中丰富你的数据。(原文:Expand your horizons by deciphering geo coordinates from IP addresses, normalizing date complexity, simplifying key-value pairs and CSV data, fingerprinting(anonymizing) sensitive information, and further enriching your data with local lookups or Elasticsearch queries.)
编码器通常用于简化对JSON和多行事件等常见事件结构的处理。
安装Logstash
NOTE : Logstash支持Java8,不支持Java9,使用Oracle 版JDK或开源的OpenJDK
使用下面的命令检查你的Java版本:
java -version
执行sudo apt-get update准备好之后使用下面的明星安装:
sudo apt-get update && sudo apt-get install logstash
查看运行Logstash查看如何以系统服务管理Logstash。
Directory layout来找到你系统上的bin/logstash。(如果使用yum进行安装,通常尝试直接执行logstash -e 'input { stdin { } } output { stdout {} }',如果使用二进制安装,则bin目录位于你解压的目录下。)
使用-e选项允许你在命令行快速配置而不必修改配置文件,这个示例将从stdin来读取你的输入,并将输出以结构化的方式输出至stdout。(就是从命令行读取,在终端上输出。)
Logstash启动之后你可以在屏幕上看到"Pipeline main started",输入hello world并回车:
hello world
2013-11-21T01:22:14.405+0000 0.0.0.0 hello world
通过Logstash解析日志
上面的示例中你已经创建了一个最基本的Logstash管道来测试你的Logstash,在实际的情形中,Logstash通常面临着更加复杂的场景:一个或多个input、filter和output插件。
本段,你将创建一个Logstash管道,使用Filebeat采集的Apache日志作为input,从日志中解析特殊字段,然后将解析后的数据写入一个Elasticsearch集群。这次你将定义一个配置文件,而不是在命令行中设定。
在这里下载示例数据,以便我们可以开始。
这里下载。你也可以在这里查看Beats的安装文档。
安装完成之后你需要进行一些配置。在你的安装目录中找到并打开filebeat.yml文件,然后使用下面的内容替换其中的内容。确保paths指向下载的测试用的Apache日志文件logstash-tutorial.log。
filebeat.prospectors:
- type: log
paths:
- /path/to/file/logstash-tutorial.log ①
output.logstash:
hosts: ["localhost:5044"]
① 文件或目录的绝对路径。(原文:Absolute path to the file or files that Filebeat processes.)
保存更改。
为了更加简单,这里不用配置TLS/SSL。在生产中,通常需要配置这些。
在数据源的主机上执行下面的命令来运行Filebeat:
sudo ./filebeat -e -c filebeat.yml -d "publish"
NOTE:如果你以root的身份运行Filebeat,你需要更改配置文件的所有权.(参考:Config File OwnerShip and Permissions)。
Filebeat使用5044进行连接,在Logstash启动Beats插件之前,Filebeat不会收到任何响应,所以此时你看到的任何连接此端口失败的消息都是正常的。
多个管道使用的。在这个演示的示例中,你只运行一个管道。
如果运行正确你应该能在屏幕上看到如下的输出信息:
{
"@timestamp" => 2017-11-09T01:44:20.071Z,
"offset" => 325,
"@version" => "1",
"beat" => {
"name" => "My-MacBook-Pro.local",
"hostname" => "My-MacBook-Pro.local",
"version" => "6.0.0"
},
"host" => "My-MacBook-Pro.local",
"prospector" => {
"type" => "log"
},
"source" => "/path/to/file/logstash-tutorial.log",
"message" => "83.149.9.216 - - [04/Jan/2015:05:13:42 +0000] \"GET /presentations/logstash-monitorama-2013/images/kibana-search.png HTTP/1.1\" 200 203023 \"http://semicomplete.com/presentations/logstash-monitorama-2013/\" \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36\"",
"tags" => [
[0] "beats_input_codec_plain_applied"
]
}
...
Grok filter插件是少数Logstash默认可以使用的插件之一。更多关于管理Logstash插件的信息,参考reference documentation。
Grok插件可以将非结构化的数据转换为高质量的结构化数据。
由于grok插件从传入的日志中进行匹配查找,所以需要你根据自己感兴趣的数据来配置插件。如典型的Web服务日志如下:
83.149.9.216 - - [04/Jan/2015:05:13:42 +0000] "GET /presentations/logstash-monitorama-2013/images/kibana-search.png
HTTP/1.1" 200 203023 "http://semicomplete.com/presentations/logstash-monitorama-2013/" "Mozilla/5.0 (Macintosh; Intel
Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36"
很容易辨认出最开始的是IP地址,方括号中的是时间标签。对于Apache日志你可以使用%{COMBINEDAPACHELOG}来将数据解析成如下结构。
| Information | Field Name |
|---|---|
| IP Address | clientip |
| User ID | ident |
| User Authentication | auth |
| timestamp | timestamp |
| HTTP Verb | verb |
| Request body | request |
| HTTP Version | httpversion |
| HTTP Status Code | response |
| Bytes served | bytes |
| Referrer URL | referrer |
| User agent | agent |
TIP:如果在构建Grok匹配模式上需要帮助,你可以使用Grok Debugger。Grok Debugger是基本许可下的X-Pack的一个附加特性,可以免费使用。
编辑first-pipeline.conf文件并使用下面的内容替换其中的filter字段:
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}"}
}
}
完成之后first-pipeline.conf中的内容应该如下:
input {
beats {
port => "5044"
}
}
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}"}
}
}
output {
stdout { codec => rubydebug }
}
保存更改,由于已经开启了自动重载配置文件,因此你不必重新启动Logstash来使配置生效。但是你需要让Filebeat强制从头开始读取日志文件。在对应的终端上使用Ctrl+C组合键来关闭Filebeat。然后删除Filebeat的registry文件,命令如下:
sudo rm data/registry
Filebeat的registry文件保存了它读取的文件的状态,删除之后可以强制让Filebeat重新从头读取这些文件。
然后使用下面的命令重启Filebeat:
sudo ./filebeat -e -c filebeat.yml -d "publish"
你可能需要等待一小会儿如果Filebeat等待Logstash重读配置文件的话。
在Logstash完成重读并匹配完成之后,事件将用JSON的格式表示如下:
{
"request" => "/presentations/logstash-monitorama-2013/images/kibana-search.png",
"agent" => "\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36\"",
"offset" => 325,
"auth" => "-",
"ident" => "-",
"verb" => "GET",
"prospector" => {
"type" => "log"
},
"source" => "/path/to/file/logstash-tutorial.log",
"message" => "83.149.9.216 - - [04/Jan/2015:05:13:42 +0000] \"GET /presentations/logstash-monitorama-2013/images/kibana-search.png HTTP/1.1\" 200 203023 \"http://semicomplete.com/presentations/logstash-monitorama-2013/\" \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36\"",
"tags" => [
[0] "beats_input_codec_plain_applied"
],
"referrer" => "\"http://semicomplete.com/presentations/logstash-monitorama-2013/\"",
"@timestamp" => 2017-11-09T02:51:12.416Z,
"response" => "200",
"bytes" => "203023",
"clientip" => "83.149.9.216",
"@version" => "1",
"beat" => {
"name" => "My-MacBook-Pro.local",
"hostname" => "My-MacBook-Pro.local",
"version" => "6.0.0"
},
"host" => "My-MacBook-Pro.local",
"httpversion" => "1.1",
"timestamp" => "04/Jan/2015:05:13:42 +0000"
}
需要注意的是原本的消息内容会被保留,但消息同时也会被分割成不同的字段。
Elasticsearch主机服务。AWS和GCP都提供了Elasticsearch服务。免费试用一下。
Logstash可以将数据索引到Elasticsearch集群。编辑first-pipeline.conf文件中的output字段,内容如下:
output {
elasticsearch {
hosts => [ "localhost:9200" ]
}
}
这个配置中,Logstash使用HTTP协议连接Elasticsearch。上面的示例中Logstash和Elasticsearch运行在相同 的实例中。你也可以指定一个远程Elasticsearch实例通过配置hosts如:hosts => ["es-machine:9200"]。
到这里,你的first-pipeline.conf包含input,filter,和output配置,没问题的话,应该是下面这样:
input {
beats {
port => "5044"
}
}
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}"}
}
geoip {
source => "clientip"
}
}
output {
elasticsearch {
hosts => [ "localhost:9200" ]
}
}
保存配置,像之前一样强制中止Filebeat,删除registry文件,然后使用下面的命令重启Filebeat:
sudo ./filebeat -e -c filebeat.yml -d "publish"
Filebeat getting started docs获取关于在Kibana中加载Filebeat索引的信息。
你已经成功的创建了一个Logstash管道,通过Filebeat采集Apache日志作为input,分析其中的特殊字段,然后将分析后的字段写入到Elasticsearch集群中。接下来,即将学习如何创建一个管道同时使用多个input和output插件。
多个输入和输出插件的混合使用
通常你管理的信息会来自于不同的地方,你的用例也可能要求将数据存储到不同的目的地。你的Logstash管道可以使用多个input和output插件来满足这些需求。
在本章节,你将创建一个Logstash管道同时从Twitter和Filebeat客户端获取信息,然后将这些信息存储到Elasticsearch集群的同时直接写入文件。
twitterinput插件。要配置这个插件,你需要下面几条信息:
- 一个用来唯一标示您的Twitter应用程序的用户密钥。
- 一个用来充当Twitter应用密码的秘密。(不知道怎么翻译这一句,原文:A consumer secret, which serves as the password for your Twitter app.)
- 要在传入的Feed中搜索的一个或多个关键字。在这个例子中使用“Cloud”作为关键字,你可以自定义你想要搜索的任何东西。
- 一个认证令牌,使此应用可以识别一个Twitter帐号。
- 一个认证令牌秘密,用作Twitter帐号密码。(原文:An oauth token secret, which serves as the password of the Twitter account.)
访问https://dev.twitter.com/apps来设置Twitter帐号和生成你的用户密钥和秘密,以及你的认证令牌和秘密。如果你不确定如何生成这些信息,查看twitterinput插件的文档来获取更多信息。
注:这个Twitter app似乎有些类似在微信或者其他什么开发平台申请的一个自己创建的应用,并非Twitter应用本身,至于那什么用户密钥,秘密,认证令牌什么的应该于此有关。鉴于Twitter属于404网站,不好研究。自己感受下吧。
和之前一样创建一个配置文件(命名为second-pipeline.conf)并且使用同样的配置框架。如果你懒,还可以复制一份刚才的,只是运行的时候确保使用的是正确的配置文件。
将下面的内容填写到input配置段中,并根据自己的情况替换其中的内容:
twitter {
consumer_key => "enter_your_consumer_key_here"
consumer_secret => "enter_your_secret_here"
keywords => ["cloud"]
oauth_token => "enter_your_access_token_here"
oauth_token_secret => "enter_your_access_token_secret_here"
}
Beats发送过来的事件。
关于更多可用的inputs的信息,查看:Input Plugins
Filter Plugins。
http://graphite.readthedocs.io/en/latest/
statsd:将数据发送给是statsd,statsd是一个“像计数器和计时器一样监听统计数据,并通过UDP发送聚合信息到一个或多个可插入后端”的服务。如果你准备好使用statsd,这个会对你有帮助。
注:引号部分为官方statsd官方介绍信息。有人翻译为“通过 UDP 或者 TCP 方式侦听各种统计信息,包括计数器和定时器,并发送聚合信息到后端服务”,不过我更倾向于我自己的翻译,因为statsd是一个监控软件,其应该是想表达像计时器一样统计信息而不是统计像计时器和定时器这样的数据。附上原文:listens for statistics, like counters and timers, sent over UDP and sends aggregates to one or more pluggable backend services
更多关于Outputs的信息,查看Output Plugins
Tuning and Profiling Logstash Performance)。
默认情况下,Logstash使用每个阶段中内存中的消息队列来缓存事件。如果Logstash被不安全的停止,则会丢失内存中的数据。要降低数据丢失的风险,可以打开Logstash持久化到磁盘的功能。参见Persistent Queues获取更多信息。
LogstashDirectory Layout
这节介绍当你解压Logstash之后默认创建的目录结构。
Configuring Logstash
logstash.yml
pipelines.yml
包含在单个Logstash实例中运行多个管道的框架和说明。更多信息参考:Multiple Pipelines
jvm.options
JVM相关设置,用来设定Java堆初始内存和最大内存。也可以在此文件中设置语言环境。一行一个设置。(这句的意思应该是每行只有一个设置。原文:Specify each flag on a separate line.)此文件中的所有设置都必须由专业人士进行。
startup.options(Linux)
包含/usr/logstash/bin/下的system-install用来创建启动脚本的配置。当你安装Logstash的时候,system-install脚本在安装的最后阶段根据此文件中的配置来设置用户、用户组、服务名和服务简介。默认情况下Logstash服务以logstash用户的身份进行安装。startup.options文件让你更容易安装Logstash服务的多实例。你可以复制并自定义其中的设置。注意startup.options文件在服务启动的时候不会读取。如果你想修改Logstash启动脚本(如更改运行用户或更改配置文件路径。)你必须以root身份重新运行system-install脚本来使新的设置生效。
logstash.yml
你可以在此文件中设置如何运行Logstash。如:你可以对管道进行配置,设置配置文件的位置,日志文件的选项和其他设置。此文件中的大多数设置可以在命令行运行Logstash的时候直接指定。所有在命令行指定的设置会覆盖此文件中的配置。
logstash.yml文件使用YAML语言进行书写。此文件的位置因不同的平台有所不同,参考Logstash目录布局。你可以使用分级或平级的方式进行设置。例如以分级的方式设置管道中batch的大小和延迟:
pipeline:
batch:
size: 125
delay: 50
TIP:关于batch的概念,在Logstash是如何运行的中有提到。在Logstash管道中,Inputs会将采集的内容发送到中央处理队列,后续的Logstash worker每次从这个队列中取走的数量叫batch。我也不知道这个要翻译成什么。直译过来有批处理的意思。
以平级的方式设置上面的内容:
pipeline.batch.size: 125
pipeline.batch.delay: 50
logstash.yml中支持bash风格的环境变量来设置各项的值。
pipeline:
batch:
size: ${BATCH_SIZE}
delay: ${BATCH_DELAY:50}
node:
name: "node_${LS_NODE_NAME}"
path:
queue: "/tmp/${QUEUE_DIR:queue}"
注意形如${VAR_NAME:default_value}这种写法是支持的,如上面的示例中设定了一个batch延迟为50的默认值和path.queue的默认值为/tmp/queue。
TIP:
${VAR_NAME:default_value}这种写法的意思是如果变量有值,就用变量里的值,如果变量为空,就用默认值。
模块也可以在logstash.yml文件中进行配置。模块定义的格式如下:
modules:
- name: MODULE_NAME1
var.PLUGIN_TYPE1.PLUGIN_NAME1.KEY1: VALUE
var.PLUGIN_TYPE1.PLUGIN_NAME1.KEY2: VALUE
var.PLUGIN_TYPE2.PLUGIN_NAME2.KEY1: VALUE
var.PLUGIN_TYPE3.PLUGIN_NAME3.KEY1: VALUE
- name: MODULE_NAME2
var.PLUGIN_TYPE1.PLUGIN_NAME1.KEY1: VALUE
var.PLUGIN_TYPE1.PLUGIN_NAME1.KEY2: VALUE
IMPORTANT:如果在命令行中使用
--modules指定模块选项,则文件中的定义会被忽略。
logstash.yml文件包含一下设置。如果你使用X-Pack,查看X-Pack在Logstash中的设置。
| Setting | Description(描述) | Default value(默认值) |
|---|---|---|
node.name |
节点的描述性名称。 | Machine’s hostname |
path.data |
Logstash及其插件持久化的数据的目录 | LOGSTASH_HOME/data |
pipeline.id |
The ID of the pipeline. | main |
pipeline.workers |
管道中filter和output阶段并行工作的worker的数量。 如果发现事件正在备份,或者CPU未饱和,请考虑增加此数量以更好地利用机器处理能力。 | CPU核心数量 |
pipeline.batch.size |
前面有提到,用来定义worker每次从inputs发送到中央队列中取出的batch的数量。更大的数量通常意味着更好的性能,但也会占用更多的内存,你可以在 jvm.options文件中增加JVM堆空间。更多信息参考: Logstash配置文件 |
125 |
pipeline.batch.delay |
当创建管道数据batch都时候,worker等待inputs数据的时间,即使没有拿到batch.size定义的数据量。 |
50 |
pipeline.unsafe_shutdown |
当此项设置为true的时候,在收到shutdown事件的时候Logstash会强制退出,即使仍有数据在内存中。默认情况下,Logstash会拒绝退出直到所有接收到的数据发送给outputs。启用此选项可能导致在关闭期间丢失数据。 |
false |
path.config |
指定主管道配置文件路径,如果路径是目录或者通配符,Logstash会根据字母顺序进行读取。 | 根据平台而异,参考: Logstash 目录布局. |
config.string |
包含用于主管道配置的一个字符串。和配置文件语法相同。 | None |
config.test_and_exit |
当此项设置为true的时候,会检查配置文件,在完成之后退出。注意此项设置不会检查Grok匹配的正确性。 Logstash 可以从目录中读取多个配置文件。如果此项配置结合 log.level: debug,Logstash会对组合的配置的每一个配置添加注释。(Logstash会将配置文件中的每一项以Debug的形式显示出来) |
false |
config.reload.automatic |
当此项设置为true的时候,程序会周期性的检查配置文件的变化,并在有变化的时候重新加载配置文件。可以通过给进程发送SIGHUP信号来重读配置文件。 |
false |
config.reload.interval |
Logstash检查配置文件变动的频率。 | 3s |
config.debug |
设置为 true的时候,将完整的编译配置作为debug日志消息。同时必须设置 log.level: debug. WARNING: 日志信息会包含明文密码。可能会导致你的密码明文出现在你的日志中。原文:The log message will include any password options passed to plugin configs as plaintext, and may result in plaintext passwords appearing in your logs! |
false |
config.support_escapes |
设置为true之后,将处理一下转意: \n 转成换行符 (ASCII 10). \r 转成回车(ASCII 13). \t 转成tab (ASCII 9). \\ 转成"\"本身 \. \" 变成双引号 \'变成引号 |
false |
modules |
When configured, modules must be in the nested YAML structure described above this table. |
None |
queue.type |
用于事件缓冲的内部队列模型。 设置为 memory 使用基于内存的队列, 或设置为 persisted 使用基于磁盘的 ACKed 队列 (persistent queues). |
memory |
path.queue |
启用持久化队列时的数据存储目录。 (queue.type: persisted). |
path.data/queue |
queue.page_capacity |
启用持久化队列时可以使用的页面文件大小。 (queue.type: persisted). The queue data consists of append-only data files separated into pages. |
64mb |
queue.max_events |
启用持久化之后队列中未读事件的最大数量。 (queue.type: persisted). |
0 (unlimited) |
queue.max_bytes |
队列最大的容量,以字节为单位,确保你定义的位置的磁盘上有足够的空间。 如果queue.max_events和queue.max_bytes同时定义,先到达的会生效。也就是小的生效。 |
1024mb (1g) |
queue.checkpoint.acks |
持久化队列开启的情况下,强制检查点之前ACKed事件的最大数量。 (queue.type: persisted)。 设置为0表示不限制:queue.checkpoint.acks: 0 |
1024 |
queue.checkpoint.writes |
持久化队列开启的情况下,强制检查点之前writes事件的最大数量。 (queue.type: persisted)。 设置为0表示不限制:queue.checkpoint.writes: 0 |
1024 |
queue.drain |
开启之后,Logstash处理完成持久化队列之后才会关闭。 | false |
dead_letter_queue.enable |
开启由插件提供的DLQ功能。 | false |
dead_letter_queue.max_bytes |
每个dead letter队列的最大值。 超出的部分会被删除。 | 1024mb |
path.dead_letter_queue |
存储dead-letter队列的目录。 | path.data/dead_letter_queue |
http.host |
设置绑定的IP地址 | "127.0.0.1" |
http.port |
设置绑定的端口 | 9600 |
log.level |
设置日志级别,有以下几种: fatalerrorwarninfodebugtrace |
info |
log.format |
设置日志格式。设置为json以JSON格式记录日志。或这只为 plain 使用 Object#.inspect记录日志。(应该是设置Logstash日志格式) |
plain |
path.logs |
The directory where Logstash will write its log to. | LOGSTASH_HOME/logs |
path.plugins |
指定Logstash搜索插件的目录,可以多次设置以设置多个查检目录。目录必须遵循以下结构: PATH/logstash/TYPE/NAME.rb其中TYPE is inputs, filters, outputs, 或 codecs, NAME就是插件的名字。 |
根据平台有差异,参考 Logstash 目录布局. |
Secrets keystore for secure settings
当你配置Logstash的时候,你可能需要指定敏感设置或配置,如密码。你可以使用Logstash keystore安全的存储这些秘密的数据以便在配置中使用,而不是依赖文件系统权限来保护这些数据。
在往keystore添加一个key和其Secret value之后,你就可以在配置敏感设置的时候使用key来替代Secret value。
引用key的方式(语法)和引用变量的方式(语法)是一样的:
${KEY}
花括号中是key的名字。
如:假定keystore中包含一个名为ES_PWD值为yourelasticsearchpassword:
- 在配置文件中,使用方式:
output { elasticsearch {...password => "${ES_PWD}" } } }(不是我多了一个括号,文档中就是多了一个括号。) - 在
logstash.yml文件使用方式:xpack.management.elasticsearch.password: ${ES_PWD}
注意Logstash keystore有别于Elasticsearch keystore。Elasticsearch的keystore让你以名字的方式存储elasticsearch.yml中的值,Logstash的keystore允许你自定义在Logstash配置中引用的名字。(原文:Whereas the Elasticsearch keystore lets you store elasticsearch.yml values by name, the Logstash keystore lets you specify arbitrary names that you can reference in the Logstash configuration.)
NOTE:目前不支持从
pipeline.yml文件和命令行(-e)选项引用keystore 数据。
NOTE:从centralized pipeline management引用keystore数据,需要每一个部署Logstash的实例本地有一个keystore副本。
当Logstash分析设置(logstash.yml)或配置(/etc/logstash/conf.d/*.conf)的时候,会在解析变量之前从keystore解析key。
Logstash目录布局来获取更多关于默认目录位置的信息。
NOTE:如果给path.settings指定了一个和logstash.yml所在目录不同的目录,你将会收到一个警告。
keystore password。
命令行标记。bin目录根据不同的平台有所不同,详见Logstash 目录布局
NOTE:如果给path.settings指定了一个和logstash.yml所在目录不同的目录,你将会收到一个警告。
命令行标记。bin目录根据不同的平台有所不同,详见Logstash 目录布局
下面的示例从mypipeline.conf文件运行一个Logstash:
bin/logstash -f mypipeline.conf
命令行指定的选项将会覆盖logstash.yml中的选项,但文件并不会改变。后续的运行仍然会使用文件中的设定。
在你测试Logstash运行的时候,指定命令行选项是非常有用的。但是我们建议在生产环境中使用logstash.yml来控制Logstash的运行。使用设置文件让定义多个选项变得容易,且为你的每次运行Logstash提供了一个单一的可验证的文件。
Logstash 配置文件
-u, --pipeline.batch.delay DELAY_IN_MS
? 当创建batches的时候,从input等待事件的超时时长。这个选项定义了如果取不到定义的batch的大小的情况下等待多少毫秒。默认是50毫秒。
--pipeline.unsafe_shutdown
? 强制退出Logstash即使内存中仍有在处理的事件。默认情况下Logstash会拒绝退出直到接收的事件处理全部交给outputs。开启之后可能在关闭的时候丢失数据。
--path.data PATH
? 此选项须指向一个可写的目录。Logstash会在需要存储数据的时候使用次目录。插件也需要对此目录可以访问。默认的data目录是Logstash的家目录。
-p, --path.plugins PATH
? 指定插件的默认目录。可以通过引用多次来包含多个目录。插件应该位于特定的目录层次之中:/PATH/logstash/TYPE/NAME.rb其中TYPE指的是inputs,filters,outputs和codecs,NAME即插件名。
-l, --path.logs PATH
? Logstash的日志目录。
--log.level LEVEL
? 设置日志等级,可能的值包括:
fatal:记录非常严重的错误信息,通常此信息之后程序即异常中止。error:记录错误信息warn:记录警告信息info:记录运行的详细信息(默认)debug:记录debugging信息(用于开发者)trace:记录比debugging更加详细的信息
--config.debug
? 将完全编译的配置作为调试日志输出(必须同时将--log.level=debug开启)。警告:日志信息会包含所有明文传递的密码,这些信息会被记录到日志中!(原文:The log message will include any passwordoptions passed to plugin configs as plaintext, and may result in plaintext passwords appearing in your logs!)注:这里的密码应该指的是程序、插件通信用到的配置中的密码。
-i, interactive SHELL
? Drop to shell instead of running as normal. Valid shells are "irb" and "pry".(不知道这个设定是什么意思。)
-V, --version
? 显示版本,然后退出。原文:Emit the version of Logstash and its friends, then exit.
-t, --config.test_and_exit
? 价差配置文件的语法,然后退出。注意Grok匹配规则不会被检查。Logstash可以读取多个配置文件从一个目录。如果同时指定了--log.level=debug,Logstash将组合多个配置文件的日志,并给每个配置块添加来源注释。
-r, --config.reload.automatic
? 监控配置文件的变化,并在其发生变化的是后重载。NOTE:使用SIGHUP信号也可以重载配置文件,默认此配置为false。
--config.reload.interval RELOAD_INTERVAL
? 检查配置文件变化的间隔时间,默认是"3s"。
--http.host HTTP_HOST
? 指定要绑定的IP地址,默认是"127.0.0.1"。
--http.port HTTP_PORT
? 指定监听的端口。默认是9600-9700。可以接受9600-9700这种格式的范围设定,Logstash会使用第一个可用的端口。
--log.format FORMAT
? 指定Logstash记录日志的格式,JSON(每行一个事件)或文本(使用Ruby’s Object#inspect)。默认是文本。
--path.settings SETTINGS_DIR
? 指定包含logstash.yml配置文件以及log4j配置。此设置还可以通过LS_SETTINGS_DIR 变量来设置。默认的目录是Logstash家目录下的config目录。
-h, --help
? 显示帮助信息。
Logging
Logstash会在运行过程将自身内部的日志发出,存放在LS_HOME/logs(使用RPM/DEB安装的放在/var/log/logstash下)。默认的日志级别是INFO。Logstash的日志框架基于Log4j 2,其大部分的功能面向用户开放。
你可以为子系统,模块或插件配置特定的日志。
当你需要进行故障排查尤其是和插件相关的时候。将日志等级调整到DEBUG来获的更多信息。比如你要对Elasticsearch Output的问题进行Debug,你可以只为这个组件升级日志。这种方法可以帮你降低过多信息带来的干扰,帮助你更好的将精力集中在问题区域。
你可以通过log4j2.properties文件或Logstash API来配置日志。
log4j2.properties文件。通过修改log4j2.properties文件配置,需要你重启Logstash来生效。更改之后在之后的运行中设置会一直生效。- Logstash API。通过此种方法可以使修改立即生效,但在Logstash重启之后配置丢失。
log4j2 configuration。
你必须重启Logstash来应用此文件中的更改。更改会在之后的运行中一直有效。
这儿有一个使用outputs.elasticsearch做的演示:
logger.elasticsearchoutput.name = logstash.outputs.elasticsearch
logger.elasticsearchoutput.level = debug
命令行选项
管道配置文件的结构
- 数组
- 列表
- 布尔
- 字节
- 哈希
- 数字
- 密码
- URI
- Path
- 字符串
- 转义序列
Input Plugins, Output Plugins, Filter Plugins, and Codec Plugins.
Codec Plugins页面查看可用的codecs列表.
示例:
codec => "json"
http://user:pass@example.net,其中的密码部分将不会被记录日志或显示.
示例:
my_uri => "http://foo:bar@example.net"
字段引用
Logstash agent是一个有着三个阶段的处理管道。包括:inputs→filters→outputs。Inputs生成事件,filters修改他们,outputs将他们送到任何地方。
所有的事件都有自己的特性。如Apache的访问日志会包括如状态码(200,404),请求路径("/","index.html"),HTTP verb(GET,POST),客户端IP地址等。Logstash将这些特性称作"fields"。
Logstash中的一些配置选项需要字段的存在才能发挥作用。因为inputs生成事件,所以在input阶段没有可用发fields,此时fields还不存在。原文:Because inputs generate events, there are no fields to evaluate within the input block—they do not exist yet!
因为对事件和fields的依赖,下面的配置仅工作在filter和output。
IMPORTANT:下面提到的字段引用,sprintf格式和条件不能在input工作。
时间格式。
Similarly, you can convert the timestamp in the @timestamp field into a string. Instead of specifying a field name inside the curly braces, use the +FORMAT syntax where FORMAT is a time format.
比如,你想要文件输出根据事件的日期和时间以及类型字段写入日志:
For example, if you want to use the file output to write to logs based on the event’s date and hour and the type field:
output {
file {
path => "/var/log/%{type}.%{+yyyy.MM.dd.HH}"
}
}
使用条件式章节.
配置Filters
以下示例说明如何配置LogStash来过滤事件,对Apache日志和syslog进行处理,并且使用条件式来控制被filter或output处理的事件.
TIP:如果你需要构建grok匹配的帮助,试试我们的Grok Debugger.Grok Debugger是基础授权下的X-Pack的一个特性所以是可以免费使用的.
Logstash grok patterns列表.
另一个在本示例中使用的filter是datefilter.这个filter解析出一个timestamp(时间戳)并将其作为事件的时间戳(不论你何时获取的你的日志数据).你可能注意到了在这个示例中@timestamp字段被设置为2013.12.11尽管Logstash是在这之后的某个事件点接收的这个事件.
条件式来根据我们的需要处理事件.首先,创建一个名字类似于logstash-apache.conf的文件,内容如下(你可以根据自己的情况修改日志文件的路径):
input {
file {
path => "/tmp/access_log"
start_position => "beginning"
}
}
filter {
if [path] =~ "access" {
mutate { replace => { "type" => "apache_access" } }
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
}
}
date {
match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
}
}
output {
elasticsearch {
hosts => ["localhost:9200"]
}
stdout { codec => rubydebug }
}
input {
file {
path => "/tmp/access_log"
start_position => "beginning"
}
}
filter {
if [path] =~ "access" {
mutate { replace => { "type" => "apache_access" } }
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
}
}
date {
match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
}
}
output {
elasticsearch {
hosts => ["localhost:9200"]
}
stdout { codec => rubydebug }
}
然后,创建你在上述配置中的input文件(示例中为"/tmp/access_log")并使用下面的日志内容(或者你可以使用来自自己网站的内容):
71.141.244.242 - kurt [18/May/2011:01:48:10 -0700] "GET /admin HTTP/1.1" 301 566 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3"
134.39.72.245 - - [18/May/2011:12:40:18 -0700] "GET /favicon.ico HTTP/1.1" 200 1189 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.2; .NET4.0C; .NET4.0E)"
98.83.179.51 - - [18/May/2011:19:35:08 -0700] "GET /css/main.css HTTP/1.1" 200 1837 "http://www.safesand.com/information.htm" "Mozilla/5.0 (Windows NT 6.0; WOW64; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"
现在,用-f选项来使用指定的配置文件启动Logstash
bin/logstash -f logstash-apache.conf
现在你应该可以在Elasticsearch中看到你的Apache日志数据.Logstash打开并读取指定的input文件,处理每一个遇到的事件.所有向此文件追加的行也会被捕获,被Logstash作为事件处理,然后存储在Elasticsearch中.一个额外的好处是"type"字段被设置为"apache_access"(这是由 type => "apache_access"这一行决定的).
这个配置文件中,Logstash只监视了Apache访问日志,不过你可以很轻松的监控访问日志和错误日志(事实上,所有可以匹配*log的文件),通过修改上述配置中的一行:
input {
file {
path => "/tmp/*_log"
}
}
当你重启Logstash,它将同时处理错误日志和访问日志.不过,如果你检查你的数据(使用Elasticsearch-kopf之类的),你可能会发现access_log被解析成了多个字段,但是error_log不是.这是因为我们使用的grokfilter只匹配了标准的apache日志格式,并自动将其分割成不同的字段.如果我们能根据每一行的格式来控制其解析方式不是更好吗?当然,我们可以...
注意Logstash不会重新处理已经看到过的access_log文件中的时间.当从一个文件读取的时候,Logstash会保存其位置并且只处理新增的行.Neat!
集中式管道管理:
-
确定你使用的授权包括管道管理功能。
更多信息,查看https://www.elastic.co/subscriptions和License Management。
-
在logstash.yml中指定configuration management settings。至少包含下面的设置
xpack.management.enable: true来开启集中式配置管理。
xpack.management.elasticsearch.url来指定将会存储Logstash管道配置和元数据的Elasticsearch实例。
xpack.management.pipeline.id来注册你想要集中管理的管道。
-
重启Logstash。
-
如果Elasticsearch使用了基本认证进行保护,给将要使用集中管道管理的任何用户分配logstash_admin的角色。参见X-Pack security。
NOTE:在配置并启用X-Pack security之前,集中式管理是禁用的。(这句话让我不是很明白集中式管道管理开启的前提是开启X-Pack Security还是说在开启X-Pack Security之后如果没有正确配置则集中式管理会被禁用,区别在于X-Pack security是否是必须开启的。)
Centralized management is disabled until you configure and enable X-Pack security.
IMPORTANT:在配置Logstash使用集中式管道管理之后,本地管道配置将不再可用。这意味着pipeline.yml文件和类似path.config以及config.string的设置将不再处于活跃状态。
集中式管道管理。更多配置Logstash的信息,查看logstash.yml。
确定你使用的授权包括管道管理功能。
更多信息,查看https://www.elastic.co/subscriptions和License Management。
在logstash.yml中指定configuration management settings。至少包含下面的设置
xpack.management.enable: true来开启集中式配置管理。xpack.management.elasticsearch.url来指定将会存储Logstash管道配置和元数据的Elasticsearch实例。xpack.management.pipeline.id来注册你想要集中管理的管道。
重启Logstash。
如果Elasticsearch使用了基本认证进行保护,给将要使用集中管道管理的任何用户分配logstash_admin的角色。参见X-Pack security。
NOTE:在配置并启用X-Pack security之前,集中式管理是禁用的。(这句话让我不是很明白集中式管道管理开启的前提是开启X-Pack Security还是说在开启X-Pack Security之后如果没有正确配置则集中式管理会被禁用,区别在于X-Pack security是否是必须开启的。)
Centralized management is disabled until you configure and enable X-Pack security.
IMPORTANT:在配置Logstash使用集中式管道管理之后,本地管道配置将不再可用。这意味着pipeline.yml文件和类似path.config以及config.string的设置将不再处于活跃状态。
下面的基本示例假定Elasticsearch和Kibana已经在本地安装并且开启了基本认证,但没有SSL。如果你使用SSL,你需要指定额外的SSL设置。
xpack.management.enabled: true
xpack.management.elasticsearch.url: "http://localhost:9200/"
xpack.management.elasticsearch.username: logstash_admin_user
xpack.management.elasticsearch.password: t0p.s3cr3t
xpack.management.logstash.poll_interval: 5s
xpack.management.pipeline.id: ["apache", "cloudwatch_logs"]
xpack.management.enabled
? 设置为true表示为Logstash开启X-Pack 集中式配置管理。
xpack.management.logstash.poll_interval
? Logstash实例轮询来自Elasticsearch的管道更改的频率。默认值为5s。
? How often the Logstash instance polls for pipeline changes from Elasticsearch. The default is 5s.
xpack.management.pipeline.id
? 指定以逗号分隔的管道标识列表,以便为集中式管道生产管理注册。更改此设置后,您需要重新启动Logstash来使更改生效。
xpack.management.elasticsearch.url
? 存储Logstash管道配置和元数据的Elasticsearch示例。可以是和outputs中的相同的实例,也可以是不同的。默认是 http://localhost:9200.
xpack.management.elasticsearch.username and xpack.management.elasticsearch.password
? 如果你的Elasticsearch集群使用基本认证进行保护,这些设置提供用户名和密码,Logstash实例使用这些用户名和密码对访问配置数据进行身份验证。你在这里指定的用户名和密码必须具有logstash_admin角色,它提供对于.logstash-*的索引的认证。
xpack.management.elasticsearch.ssl.ca
? 可选项,你可以给你的Elasticsearch示例指定一个.pem文件格式的证书的路径。
xpack.management.elasticsearch.ssl.truststore.path
? 可选设置,提供了验证服务器证书的Java密钥库(JKS)的路径。
? Optional setting that provides the path to the Java keystore (JKS) to validate the server’s certificate.
xpack.management.elasticsearch.ssl.truststore.password
可选项,向truststore提供一个密码
xpack.management.elasticsearch.ssl.keystore.path
? 可选设置,提供了验证客户端证书的Java密钥库(JKS)的路径。
? Optional setting that provides the path to the Java keystore (JKS) to validate the client’s certificate.
xpack.management.elasticsearch.ssl.keystore.password
? 可选设置,向keystore提供密码。
? Optional setting that provides the password to the keystore.
集中式管道管理
管道管理特性在Kibana中集中了创建和管理Logstash管道配置的功能.
NOTE:集中式管道管理是不包括在基本许可内的X-Pack的特性.如果你想要使用所有的功能,你可以试用30天.试用结束后,你可以购买我们的订阅来继续使用X-Pack的所有功能.更多信息请参考https://www.elastic.co/subscriptions 和 License Management.
你可以在Kibana的管理页面中控制多个Logstash的实例.你可以增加,编辑和删除管道配置.在Logstash端,你只需要简单的配置以开启配置管理以及注册Logstash以使用集中式的管道配置.
IMPORTANT:在你配置Logstash使用集中式管道管理之后,你可以不必在指定本地配置.并且
pipelins.yml文件以及path.config和config.string的设置也将在开启集中式管道管理之后失效.
Configure centralized pipeline management. (配置集中式管道管理)
logstash_admin和logstash_writer两个角色.另外,为了在管理界面查看(只读方式)非集中式管道,确保同时扮演了monitoring_user角色.额外信息:上面两个链接中的章节,在官方文档目录中并不存在.但根据页面上的前后翻页信息来看,是有完整的一个章节的.
在Kibana中管理Logstash管道:
-
在你的浏览器中打开Kibana并切换到Management标签.如果你正确配置了配置管理,你会看到一个管理Logstash的区域.

-
点击 Pipeline链接.
-
要添加新的管道,点击Create pipeline并制定值.
| Pipeline ID | A name that uniquely identifies the pipeline. This is the ID that you used when you configured centralized pipeline management and specified a list of pipeline IDs in the xpack.management.pipeline.id setting. |
|---|---|
| Description | 管道配置的描述.这个信息是你自己用的. |
| Pipeline | 管道配置,你可以像对待其他编辑器一样对待这里的编辑器.并且你不必担心空白和所进的问题. |
| Pipeline workers | 管道中运行filter以及output阶段并行工作的worker的数量 |
| Pipeline batch size | 每个工作线程向filter和output传递事件的时候,每次传送的事件的最大数量 |
| Pipeline batch delay | 每个工作线程在获取事件时,在无法达到最大事件数量的时候每个worker等待的时长(以毫秒为单位) (这个配置和上一个是有关系的,即Logstash在处理事件的时候每个worker会收集一定量的事件交由后续处理,如果在在规定时间内依旧无法收集到足够的事件,worker不会在继续等待.这里配置的就是这个等待时间.) |
| Queue type | 事件缓冲区的队列模型. |
| Queue max bytes | 所有队列的容量 |
| Queue checkpoint writes | 启用持久队列时,在强制检查点之前写入的最大事件数。The maximum number of events written before a checkpoint is forced when persistent queues are enabled. |
管道行为
- 管道的配置和元数据存储在Elasticsearch中.对管道定义所做的任何更改都会被注册使用的所有Logstash示例自动读取和加载.(类似配置中心的概念).更改会立即生效.如果Logstash注册使用了管道,你不必重新启动Logstash来读取配置.
- 管道将在所有注册使用的Logstash上运行.Kibana保存新的配置,Logstash尝试载入.There is no validation done at the UI level.
- 你需要在本地Logstash日志中检查配置错误.如果你使用了X-Pack的监控功能,在监控页面查看Logstash实例的状态.
- 你可以定义多个管道配置并行运行在同一个Logstash节点上.
- 如果你编辑并保存了配置,Logstash会在后台重新加载配置并继续处理事件.
- 如果你尝试在Kibana中删除一个正在运行中的管道,Logstash将会尝试停止这个管道.Logstash会等待事件处理完毕.在你删除一个管道之前,确保你理解你的数据源.停止管道可能会导致数据丢失.