1.1 基本介绍
1.1.1 工作原理
Logstash 是由 JRuby 编写的,使用基于消息的简单架构,在 JVM 上运行(本篇博客主要介绍 Logstash 基本使用,介绍请见 ☞【全文检索_09】Logstash 基本介绍)。Logstash 的事件处理流水线有三个主要角色完成:inputs → filters → outputs。必须定义这些过程的配置才能使用 Logstash,尽管不是每一个都必须的。在过滤器的部分,它可以对数据源的数据进行分析,丰富,处理等等,但是我们可以不使用过滤器。在输出的部分,我们可以有多于一个以上的输出。
1.1.2 各组件可用插件
1.1.3 启动参数
参数 | 说明 | 举例 |
---|---|---|
-e | 立即执行,使用命令行里的配置参数启动实例 | ./bin/logstash -e 'input { stdin {} } output { stdout {} }' |
-f | 指启动实例的配置文件 | ./bin/logstash -f first-pipeline.conf |
-t | 测试配置文件的正确性 | ./bin/logstash -f first-pipeline.conf -t |
-l | Logstash 内部日志输出目录 | ./bin/logstash -f first-pipeline.conf -l logs/test.log |
-w | 指定 filer 线程数量,默认线程数是 5 | ./bin/logstash -f first-pipeline.conf -w 10 |
1.2 inputs
1.2.1 File 监听插件
☞ 概述
文件监听插件主要用来抓取文件的变化信息,将变化信息封装成 event 进程处理或者传递。这里介绍几个 File 插件的参数以及简单示例,详细内容见
☞ 官方文档
☞ 常用参数
参数 | 类型 | 默认值 | 说明 |
---|---|---|---|
path | Array | | 匹配监听文件【必设项】 |
exclude | Array | | 排除项,排除匹配某个文件 |
close_older | Number | 1 hour | 设置文件多久秒内没有更新就关掉对文件的监听 |
delimiter | String | n | 文件内容的行分隔符 |
start_position | beginning / end | end | 选择 Logstash 最初开始读取文件的位置,默认从结尾开始 |
除上述特有参数以外,还有诸多类似于下表的公共参数,所有插件中均可使用公共参数。详见 ☞ 官方文档
参数 | 类型 | 默认值 | 说明 |
---|---|---|---|
add_field | Hash | {} | 添加自定义字段 |
codec | Codec | plain | 输入输出时对数据编解码 |
enable_metric | Boolean | true | 为此插件实例禁用或启用度量标准日志记录 |
id | String | | 添加唯一 id |
tags | Array | | 添加标签 |
☞ 示例
代码语言:javascript复制input
file {
path => ["/var/log/*.log", "/var/log/message"]
start_position => "beginning"
}
}
1.2.2 Beats 监听插件
☞ 概述
Beats插件用于建立监听服务,该输入插件使 Logstash 接收 Filebeat 或者其他 beat 发送的事件。这里介绍几个 Beats 插件的参数以及简单示例,详细内容见
☞ 官方文档
☞ 常用参数
参数 | 类型 | 默认值 | 说明 |
---|---|---|---|
host | String | 0.0.0.0 | 监听的 IP 地址 |
port | Number | | 监听的端口【必设项】 |
ssl | Boolean | false | 是否启用 ssl |
☞ 示例
代码语言:javascript复制input {
beats {
port => 5044
}
}
1.2.3 TCP 监听插件
☞ 概述
TCP 插件通过 TCP Socket 读取事件,像标准输入和文件输入一样,每个事件都假定为一行文本。根据模式,可以接受来自 Client 的连接,也可以连接到 Server。这里介绍几个 TCP 插件的参数以及简单示例,详细内容见
☞ 官方文档
☞ 常用参数
参数 | 类型 | 默认值 | 说明 |
---|---|---|---|
host | String | 0.0.0.0 | 监听的 IP 地址 |
port | Number | | 监听的端口【必设项】 |
mode | String | server | 若是 server 则监听 client 连接;若是 client 则连接 server |
proxy_protocol | Boolean | false | 是否启用代理协议,支持 V1 |
ssl_enable | Boolean | false | 是否启用 ssl |
☞ 示例
代码语言:javascript复制input {
tcp {
port => 12345
codec => json
}
}
1.2.4 Redis 监听插件
☞ 概述
Redis 插件将从 Redis 实例读取事件;Redis v1.3.1 支持 Logstash 使用的 list 命令,而Redis v1.3.8 支持 Logstash 使用的 channel 命令。虽然可以使这些低版本 Redis 正常工作,但在较新的稳定版本中将获得最佳性能和稳定性。建议使用 2.6.0 版本。 详见 ☞ 官方文档
☞ 常用参数
参数 | 类型 | 默认值 | 说明 |
---|---|---|---|
host | String | 127.0.0.1 | 监听的 IP 地址 |
port | Number | 6379 | 监听的端口 |
data_type | String | | Redis 工作方式,有三种参数:list/channel/pattern_channel |
db | Number | 0 | Redis 数据库号 |
key | String | | 监听的健【必设项】 |
password | String | | 登录密码 |
ssl | Boolean | false | 是否启用 ssl |
timeout | Number | 5 | 超时时间,单位为秒 |
☞ 示例
代码语言:javascript复制input {
redis {
data_type => "list"
key => "logstash-test-list"
host => "127.0.0.1"
port => 6379
}
}
1.2.5 Syslog 监听插件
☞ 概述
Syslog 插件将 syslog 消息作为事件通过网络读取。当然,syslog 是一个非常混乱的名词。默认情况下,此输入仅支持 RFC3164 syslog,如果提供了功能性的 grok_pattern,则可以读取和解析一些非标准的 syslog 格式。详见 ☞ 官方文档
☞ 常用参数
参数 | 类型 | 默认值 | 说明 |
---|---|---|---|
host | String | 0.0.0.0 | 监听的 IP 地址 |
port | Number | 514 | 监听的端口 |
proxy_protocol | Boolean | false | 是否启用代理协议,支持 V1 |
grok_pattern | String | <%{POSINT:priority}>%{SYSLOGLINE} | 默认值应读取并正确解析与 RFC3164 完全兼容的 syslog行。覆盖此值,以使用有效的 grok_pattern 解析非标准行。 |
syslog_field | String | message | 编解码器在解析其余数据之前先处理数据。 |
☞ 示例
代码语言:javascript复制input {
syslog {
port => 12345
codec => cef
syslog_field => "syslog"
grok_pattern => "<%{POSINT:priority}>%{SYSLOGTIMESTAMP:timestamp} CUSTOM GROK HERE"
}
}
1.3 outputs
1.3.1 ElasticSearch 输出插件
☞ 概述
如果打算使用 Kibana Web 界面来分析 Logstash 转换的数据,请使用 Elasticsearch 输出插件将数据导入 Elasticsearch。此输出仅说明 HTTP 协议,因为它是与 Elasticsearch 进行交互的首选协议。在以前的版本中,可以 transport 协议与 Elasticsearch 通信,该协议现在保留用于节点之间的内部集群通信。 Elasticsearch V7.0.0 中已弃用使用传输协议与集群进行通信,而在 V8.0.0中已将其删除。详见 ☞ 官方文档
☞ 常用参数
参数 | 类型 | 默认值 | 说明 |
---|---|---|---|
hosts | URI | //127.0.0.1 | Elasticsearch 服务地址,配置多个开启负载均衡 |
index | String | logstash-%{ yyyy.MM.dd} | 存入 Elasticsearch 索引 |
ilm_enabled | true/false/auto | auto | 是否启用 ILM 功能 |
user | String | | 登录用户 |
password | String | | 登录密码 |
proxy | URI | | 转发 HTTP 代理 |
template | Path | | 设置模板路径,不设则使用默认模板 |
☞ 示例
代码语言:javascript复制output {
elasticsearch {
hosts => ["127.0.0.1:9200"]
index => "filebeat-%{type}-%{ yyyy.MM.dd}"
template_overwrite => true
}
}
1.3.2 Redis 输出插件
☞ 概述
用于将事件写入 Redis 中进行缓存,通常情况下 Logstash 的 Filter 处理比较吃系统资源,复杂的 Filter 处理会非常耗时,如果事件产生速度比较快,可以使用 Redis 作为 buffer 使用。详见 ☞ 官方文档
☞ 常用参数
参数 | 类型 | 默认值 | 说明 |
---|---|---|---|
host | String | 127.0.0.1 | 监听的 IP 地址 |
port | Number | 6379 | 监听的端口 |
data_type | list/channel | | Redis 工作方式 |
db | Number | 0 | Redis 数据库号 |
key | String | | key 名 |
password | String | | 登录密码 |
timeout | Number | 5 | 超时时间,单位为秒 |
☞ 示例
代码语言:javascript复制output {
redis {
host => "127.0.0.1"
port => 6379
data_type => "list"
key => "logstash-list"
}
}
1.3.3 File 输出插件
☞ 概述
File 插件将事件写入磁盘上的文件,默认情况下,以 json 格式每行写入一个事件。可以使用行编解码器自定义行格式。详见 ☞ 官方文档
☞ 常用参数
参数 | 类型 | 默认值 | 说明 |
---|---|---|---|
path | String | | 要写入文件的路径【必设项】 |
gzip | Boolean | false | 在写入磁盘之前,先对输出流进行 gzip 处理。 |
write_behavior | String | append | append: 追加写;overwrite: 覆盖写 |
flush_interval | Number | 2 | 日志文件刷新间隔,单位为秒 |
☞ 示例
代码语言:javascript复制output {
file {
path => "./test-%{ YYYY-MM-dd}.txt"
}
}
1.4 filters
1.4.1 grok 正则捕获
☞ 概述
Grok 是将非结构化日志数据解析为结构化和可查询内容的好方法。该工具非常适合 syslog 日志, apache 和其他 Web 服务器日志,mysql 日志,以及通常用于人类而非计算机使用的任何日志格式。详见 官网文档
☞ 示例
代码语言:javascript复制filter {
grok {
match => {
"message" => "Duration: %{NUMBER:duration}"
}
}
}
1.4.2 date 时间处理插件
☞ 概述
date 时间处理插件用于解析字段中的日期,然后使用该日期或时间戳作为事件的 logstash 时间戳。详见 官网文档
☞ 示例
代码语言:javascript复制filter {
date {
match => [ "logdate", "MMM dd yyyy HH:mm:ss" ]
}
}
1.4.3 mutate 数据修改插件
☞ 概述
mutate 数据修改插件提供了丰富的基础类型数据处理能力。可对字段执行常规变异,即重命名,删除,替换和修改事件中的字段。详见 官网文档
☞ 示例
代码语言:javascript复制filter {
mutate {
split => ["hostname", "."]
add_field => { "shortHostname" => "%{hostname[0]}" }
}
mutate {
rename => ["shortHostname", "hostname" ]
}
}
1.4.4 JSON 格式解码插件
☞ 概述
这是一个 JSON 解析过滤器。它采用一个包含 JSON 的现有字段,并将其扩展为 Logstash 事件内的实际数据结构。默认情况下,它将解析的 JSON 放在 Logstash 事件的根中,但是可以使用目标配置将此过滤器配置为将 JSON 放入任何任意事件字段中。详见 官网文档
☞ 示例
代码语言:javascript复制filter {
json {
source => "message"
target => "doc"
}
}
1.5 codecs
1.5.1 plain 插件
☞ 概述
plain 插件用于纯文本,事件之间没有定界。这主要用于已在其传输协议中定义了帧的输入和输出。详见 官网文档
☞ 示例
代码语言:javascript复制output {
# 输出到控制台
stdout {
codec => plain
}
}
1.5.2 rubydebug 插件
☞ 概述
rubydebug 编解码器将使用 Ruby Amazing Print 库输出 Logstash 事件数据。详见 官网文档
☞ 示例
代码语言:javascript复制output {
# 输出到控制台
stdout {
codec => rubydebug
}
}