WEBKT

Logstash 实战:从入门到精通,配置文件案例解析与高级应用

3 0 0 0

Logstash 是什么?

为什么选择 Logstash?

Logstash 的核心概念

Logstash 配置文件详解

Input 插件配置示例

1. 从文件中读取数据

2. 从标准输入读取数据

Filter 插件配置示例

1. 使用 grok 解析非结构化数据

2. 修改字段的值

Output 插件配置示例

1. 将数据发送到 Elasticsearch

2. 将数据输出到标准输出

高级应用场景

1. 处理文件轮转

2. 动态添加文件监控

3. 监控 NFS 文件

4. 多行日志处理

5. 使用条件判断

总结

你好,我是你们的“码农老司机”。今天咱们来聊聊 Logstash,这个在 ELK(Elasticsearch, Logstash, Kibana)技术栈中负责数据收集和处理的强大工具。很多刚接触 Logstash 的朋友,可能会觉得它的配置有点复杂,不知道从何下手。别担心,今天我就带你从入门到精通,通过大量的实例和配置示例,让你彻底掌握 Logstash 的使用技巧,并解决实际应用中可能遇到的问题。

Logstash 是什么?

Logstash 是一个开源的数据收集引擎,具有实时管道功能。它可以动态地统一不同来源的数据,并将数据标准化到你选择的目的地。简单来说,Logstash 就像一个“数据搬运工”,它可以从各种不同的地方(比如日志文件、数据库、消息队列等)收集数据,然后对数据进行过滤、转换等处理,最后将处理后的数据发送到指定的地方(比如 Elasticsearch、数据库、文件等)。

为什么选择 Logstash?

  • 开源免费: Logstash 是一个开源项目,你可以免费使用它,并且可以根据自己的需求进行定制。
  • 强大的插件生态系统: Logstash 拥有丰富的插件,可以支持各种不同的数据源和输出目的地。
  • 灵活的配置: Logstash 的配置文件非常灵活,你可以根据自己的需求对数据进行各种处理。
  • 实时处理: Logstash 可以实时处理数据,保证数据的及时性。
  • 可扩展性: Logstash 可以通过水平扩展来处理大量的数据。

Logstash 的核心概念

在深入了解 Logstash 的配置之前,我们需要先了解几个核心概念:

  • Input: 数据输入,负责从各种来源读取数据。常见的 Input 插件有:
    • file:从文件中读取数据。
    • stdin:从标准输入读取数据。
    • syslog:接收 syslog 消息。
    • beats:接收来自 Beats 家族(如 Filebeat、Metricbeat)的数据。
    • jdbc:从关系型数据库中读取数据。
    • kafka:从 Kafka 消息队列中读取数据。
  • Filter: 数据过滤和处理,负责对数据进行各种转换和处理。常见的 Filter 插件有:
    • grok:使用正则表达式解析非结构化数据。
    • mutate:修改字段的值、类型等。
    • date:解析日期字段。
    • geoip:根据 IP 地址解析地理位置信息。
    • drop:丢弃事件。
  • Output: 数据输出,负责将处理后的数据发送到指定目的地。常见的 Output 插件有:
    • elasticsearch:将数据发送到 Elasticsearch。
    • file:将数据写入文件。
    • stdout:将数据输出到标准输出。
    • kafka:将数据发送到 Kafka 消息队列。
  • Codec: 编解码器,负责对数据进行编码和解码。常见的 Codec 插件有:
    • json:将数据编码/解码为 JSON 格式。
    • plain:纯文本格式。
    • multiline:处理多行日志。
  • Pipeline: 管道,由 Input、Filter 和 Output 组成,定义了数据的处理流程。

Logstash 配置文件详解

Logstash 的配置文件使用一种名为 Logstash Configuration Language 的语言编写,它是一种基于 Ruby 的 DSL(Domain Specific Language)。配置文件的基本结构如下:

input {
# ... Input 插件配置 ...
}
filter {
# ... Filter 插件配置 ...
}
output {
# ... Output 插件配置 ...
}

Input 插件配置示例

1. 从文件中读取数据

input {
file {
path => "/var/log/myapp/*.log"
start_position => "beginning"
sincedb_path => "/dev/null"
}
}
  • path:指定要读取的文件路径,可以使用通配符 *
  • start_position:指定从文件的哪个位置开始读取数据,beginning 表示从文件开头开始读取,end 表示从文件末尾开始读取(只读取新添加的数据)。
  • sincedb_path:指定 sincedb 文件的路径,sincedb 文件用于记录文件的读取位置,防止 Logstash 重复读取数据。如果设置为 /dev/null,则不记录读取位置,每次启动 Logstash 都会从头开始读取文件。

2. 从标准输入读取数据

input {
stdin {}
}

这个配置表示从标准输入读取数据,通常用于调试。

Filter 插件配置示例

1. 使用 grok 解析非结构化数据

filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
}
}
  • match:指定要匹配的字段和正则表达式。%{COMBINEDAPACHELOG} 是 Logstash 内置的一个正则表达式,用于解析 Apache 日志。

2. 修改字段的值

filter {
mutate {
add_field => { "new_field" => "new_value" }
remove_field => ["old_field"]
rename => { "old_name" => "new_name" }
replace => { "field" => "new_value" }
convert => { "field" => "integer" }
}
}
  • add_field: 添加字段
  • remove_field: 移除字段
  • rename:重命名字段。
  • replace:替换字段的值。
  • convert:转换字段的类型。

Output 插件配置示例

1. 将数据发送到 Elasticsearch

output {
elasticsearch {
hosts => ["localhost:9200"]
index => "myapp-%{+YYYY.MM.dd}"
}
}
  • hosts:指定 Elasticsearch 的地址。
  • index:指定要写入的索引名称,可以使用 %{+YYYY.MM.dd} 动态生成索引名称。

2. 将数据输出到标准输出

output {
stdout { codec => rubydebug }
}
  • codec => rubydebug:使用 rubydebug 编解码器,可以将数据以 Ruby 对象的形式输出到标准输出,方便调试。

高级应用场景

1. 处理文件轮转

当日志文件进行轮转(例如,每天生成一个新的日志文件)时,我们需要确保 Logstash 能够正确地处理这些文件。可以使用 file input 插件的 path 选项和通配符 * 来实现:

input {
file {
path => "/var/log/myapp/*.log"
start_position => "beginning"
sincedb_path => "/var/log/.sincedb"
}
}

Logstash会自动检测新文件,读取新内容。sincedb_path 的设置保证了文件不会被重复读取。

2. 动态添加文件监控

如果你希望在 Logstash 运行时动态添加要监控的文件,可以使用 file input 插件的 discover_interval 选项:

input {
file {
path => "/var/log/myapp/*.log"
start_position => "beginning"
sincedb_path => "/var/log/.sincedb"
discover_interval => 15
}
}

discover_interval 指定了 Logstash 检查新文件的间隔时间(单位:秒)。

3. 监控 NFS 文件

监控 NFS 文件时,需要注意 NFS 的缓存机制可能会导致 Logstash 无法及时读取到新写入的数据。可以使用 file input 插件的 force_unlink 选项来解决这个问题:

input {
file {
path => "/mnt/nfs/myapp/*.log"
start_position => "beginning"
sincedb_path => "/var/log/.sincedb"
force_unlink => true
}
}

force_unlink 选项会强制 Logstash 在每次读取文件后删除 sincedb 文件,从而避免 NFS 缓存的影响。但是,请谨慎使用此选项,因为它可能会导致数据丢失。 更好的做法是调整NFS挂载选项, 例如使用 noac 选项禁用属性缓存。

4. 多行日志处理

有些日志是多行输出的,比如 Java 的异常堆栈信息。这时可以使用 multiline codec 来处理:

input {
file {
path => "/var/log/myapp/exceptions.log"
start_position => "beginning"
sincedb_path => "/dev/null"
codec => multiline {
pattern => "^%{TIMESTAMP_ISO8601} "
negate => true
what => "previous"
}
}
}
  • pattern:指定多行日志的起始行的正则表达式。
  • negate:设置为 true 表示匹配到的行不是起始行。
  • what:指定如何合并多行日志,previous 表示将当前行合并到上一行,next 表示将当前行合并到下一行。
    这个例子中表示所有不是以时间戳开头的行,都合并到上一行。

5. 使用条件判断

Logstash 的配置文件支持条件判断,可以根据不同的条件执行不同的操作。例如:

filter {
if [loglevel] == "ERROR" {
mutate {
add_tag => ["error"]
}
}
}
output {
if "error" in [tags] {
elasticsearch {
hosts => ["localhost:9200"]
index => "myapp-errors-%{+YYYY.MM.dd}"
}
}
}

这个配置表示如果日志级别为 ERROR,则添加 error 标签,并将数据写入到 myapp-errors 索引。

总结

Logstash 是一个非常强大的数据收集和处理工具,通过合理的配置,可以帮助你轻松地处理各种不同的数据。希望通过这篇文章,你已经对 Logstash 有了更深入的了解,并能够将其应用到你的实际工作中。

当然,Logstash 的功能远不止这些,还有很多高级的用法等待你去探索。如果你在使用 Logstash 的过程中遇到了任何问题,欢迎随时向我提问,我会尽力帮助你解决。

记住,实践是检验真理的唯一标准。多动手,多尝试,你才能真正掌握 Logstash 的精髓。加油!

码农老司机 LogstashELK数据收集

评论点评

打赏赞助
sponsor

感谢您的支持让我们更好的前行

分享

QRcode

https://www.webkt.com/article/8352