Elastic 技术栈之 Logstash 基础
本文是 Elastic 技术栈(ELK)的 Logstash 应用。
Logstash 可以传输和处理你的日志、事务或其他数据。
Logstash 是 Elasticsearch 的最佳数据管道。
Logstash 是插件式管理模式,在输入、过滤、输出以及编码过程中都可以使用插件进行定制。Logstash 社区有超过 200 种可用插件。
Logstash 有两个必要元素:
input
和 output
,一个可选元素:filter
。这三个元素,分别代表 Logstash 事件处理的三个阶段:输入 > 过滤器 > 输出。

img
- input 负责从数据源采集数据。
- filter 将数据修改为你指定的格式或内容。
- output 将数据传输到目的地。
在实际应用场景中,通常输入、输出、过滤器不止一个。Logstash 的这三个元素都使用插件式管理方式,用户可以根据应用需要,灵活的选用各阶段需要的插件,并组合使用。
后面将对插件展开讲解,暂且不表。
logstash.yml
:logstash 的默认启动配置文件jvm.options
:logstash 的 JVM 配置文件。startup.options
(Linux):包含系统安装脚本在/usr/share/logstash/bin
中使用的选项为您的系统构建适当的启动脚本。安装 Logstash 软件包时,系统安装脚本将在安装过程结束时执行,并使用startup.options
中指定的设置来设置用户,组,服务名称和服务描述等选项。
参数 | 描述 | 默认值 |
node.name | 节点名 | 机器的主机名 |
path.data | Logstash及其插件用于任何持久性需求的目录。 | LOGSTASH_HOME/data |
pipeline.workers | 同时执行管道的过滤器和输出阶段的工作任务数量。如果发现事件正在备份,或CPU未饱和,请考虑增加此数字以更好地利用机器处理能力。 | Number of the host’s CPU cores |
pipeline.batch.size | 尝试执行过滤器和输出之前,单个工作线程从输入收集的最大事件数量。较大的批量处理大小一般来说效率更高,但是以增加的内存开销为代价。您可能必须通过设置 LS_HEAP_SIZE 变量来有效使用该选项来增加JVM堆大小。 | 125 |
pipeline.batch.delay | 创建管道事件批处理时,在将一个尺寸过小的批次发送给管道工作任务之前,等待每个事件需要多长时间(毫秒)。 | 5 |
pipeline.unsafe_shutdown | 如果设置为true,则即使在内存中仍存在inflight事件时,也会强制Logstash在关闭期间退出。默认情况下,Logstash将拒绝退出,直到所有接收到的事件都被推送到输出。启用此选项可能会导致关机期间数据丢失。 | false |
path.config | 主管道的Logstash配置路径。如果您指定一个目录或通配符,配置文件将按字母顺序从目录中读取。 | |
config.string | 包含用于主管道的管道配置的字符串。使用与配置文件相同的语法。 | None |
config.test_and_exit | 设置为true时,检查配置是否有效,然后退出。请注意,使用此设置不会检查grok模式的正确性。 Logstash可以从目录中读取多个配置文件。如果将此设置与log.level:debug结合使用,则Logstash将记录组合的配置文件,并注掉其源文件的配置块。 | false |
config.reload.automatic | 设置为true时,定期检查配置是否已更改,并在配置更改时重新加载配置。这也可以通过SIGHUP信号手动触发。 | false |
config.reload.interval | Logstash 检查配置文件更改的时间间隔。 | 3s |
config.debug | 设置为true时,将完全编译的配置显示为调试日志消息。您还必须设置 log.level:debug 。警告:日志消息将包括任何传递给插件配置作为明文的“密码”选项,并可能导致明文密码出现在您的日志! | false |
config.support_escapes | 当设置为true时,带引号的字符串将处理转义字符。 | false |
modules | 配置时,模块必须处于上表所述的嵌套YAML结构中。 | None |
http.host | 绑定地址 | "127.0.0.1" |
http.port | 绑定端口 | 9600 |
log.level | 日志级别。有效选项:fatal > error > warn > info > debug > trace | info |
log.format | 日志格式。json (JSON 格式)或 plain (原对象) | plain |
path.logs | Logstash 自身日志的存储路径 | LOGSTASH_HOME/logs |
path.plugins | 在哪里可以找到自定义的插件。您可以多次指定此设置以包含多个路径。 | |
通过命令行启动 logstash 的方式如下:
bin/logstash [options]
其中 [options] 是您可以指定用于控制 Logstash 执行的命令行标志。
在命令行上设置的任何标志都会覆盖 Logstash 设置文件(
logstash.yml
)中的相应设置,但设置文件本身不会更改。注虽然可以通过指定命令行参数的方式,来控制 logstash 的运行方式,但显然这么做很麻烦。建议通过指定配置文件的方式,来控制 logstash 运行,启动命令如下:bin/logstash -f logstash.conf
上节,我们了解到,logstash 可以执行
bin/logstash -f logstash.conf
,按照配置文件中的参数去覆盖默认设置文件(logstash.yml
)中的设置。这节,我们就来学习一下这个配置文件如何配置参数。
在工作原理一节中,我们已经知道了 Logstash 主要有三个工作阶段 input 、filter、output。而 logstash 配置文件文件结构也与之相对应:
input {}
filter {}
output {}
每个部分都包含一个或多个插件的配置选项。如果指定了多个过滤器,则会按照它们在配置文件中的显示顺序应用它们。
插件的配置由插件名称和插件的一个设置块组成。
下面的例子中配置了两个输入文件配置:
input {
file {
path => "/var/log/messages"
type => "syslog"
}
file {
path => "/var/log/apache/access.log"
type => "apache"
}
}
一个插件可以要求设置的值是一个特定的类型,比如布尔值,列表或哈希值。以下值类型受支持。
- Array
users => [ {id => 1, name => bob}, {id => 2, name => jane} ]
- Lists
path => [ "/var/log/messages", "/var/log/*.log" ]
uris => [ "http://elastic.co", "http://example.net" ]
- Boolean
ssl_enable => true
- Bytes
my_bytes => "1113" # 1113 bytes
my_bytes => "10MiB" # 10485760 bytes
my_bytes => "100kib" # 102400 bytes
my_bytes => "180 mb" # 180000000 bytes
- Codec
codec => "json"
- Hash
match => {
"field1" => "value1"
"field2" => "value2"
...
}
- Number
port => 33
- Password
my_password => "password"
- URI
my_uri => "http://foo:[email protected]"
- Path
my_path => "/tmp/logstash"
- String
- 转义字符
Logstash 支持各种输入选择 ,可以在同一时间从众多常用来源捕捉事件。能够以连续的流式传输方式,轻松地从您的日志、指标、Web 应用、数据存储以及各种 AWS 服务采集数据。
- file:从文件系统上的文件读取,就像UNIX命令
tail -0F
一样 - syslog:在众所周知的端口514上侦听系统日志消息,并根据RFC3164格式进行解析
- redis:从redis服务器读取,使用redis通道和redis列表。 Redis经常用作集中式Logstash安装中的“代理”,它将来自远程Logstash“托运人”的Logstash事件排队。
- beats:处理由Filebeat发送的事件。
过滤器是Logstash管道中的中间处理设备。如果符合特定条件,您可以将条件过滤器组合在一起,对事件执行操作。
- grok:解析和结构任意文本。 Grok目前是Logstash中将非结构化日志数据解析为结构化和可查询的最佳方法。
- mutate: