利用Logstash收集、解析和转换数据
1. 简介
在日志分析或事件分析系统中,ELK Stack扮演着重要角色。Logstash作为ELK Stack中极为重要的组件,能够帮助我们收集、解析和转换任何格式和类型的数据,将其转化为通用格式,进而用于构建各种应用场景下的分析系统。
2. Logstash基础配置
Logstash的配置通常由一系列输入、过滤和输出插件组成,其通用配置结构如下:
input {
}
filter {
}
output {
}
输入插件用于生成事件,过滤插件对事件进行修改,输出插件则将处理后的事件发送到其他系统。常见的输入插件有
file
、
stdin
、
lumberjack
、
twitter
等;过滤插件有
grok
、
grep
、
mutate
、
drop
、
date
等;输出插件有
elasticsearch
、
stdout
、
mongodb
等。
3. Logstash插件操作与数据类型
3.1 列出插件
-
列出所有可用插件:
bin/plugin list -
列出包含特定名称片段的插件:
bin/plugin list <namefragment> -
按组列出插件(如输入、输出、过滤):
bin/plugin list --group <group name>,例如bin/plugin list --group output
3.2 插件属性的数据类型
| 数据类型 | 描述 | 示例 |
|---|---|---|
| 数组(Array) | 用于一个属性的多个值的集合 |
path => ["value1","value2"]
|
| 布尔值(Boolean) |
取值为
true
或
false
|
periodic_flush => false
|
| 编解码器(Codec) | 用于输入或输出时对数据进行编码或解码 |
codec => "json"
|
| 哈希(Hash) | 键值对的集合 |
match => { "key1" => "value1" "key2" => "value2"}
|
| 字符串(String) | 用引号括起来的字符序列 |
value => "Welcome to ELK"
|
3.3 注释
在Logstash配置中,注释以
#
开头,例如:
#this represents a comment
3.4 字段引用
字段可以通过
[field_name]
引用,嵌套字段使用
[level1][level2]
引用。
3.5 Logstash条件语句
Logstash条件语句用于在特定条件下过滤事件或日志行,其语法与其他编程语言类似,支持
if
、
if else
和
else
语句,且可以嵌套。条件语句使用比较运算符、布尔运算符和一元运算符。
if <conditional expression1>{
#some statements here.
}
else if <conditional expression2>{
#some statements here.
}
else{
#some statements here.
}
示例:
filter {
if [action] == "login" {
mutate { remove => "password" }
}
}
output {
# Send Email on Production Errors
if [loglevel] == "ERROR" and [deployment] == "production" {
email{
}
}
}
4. 输入插件
4.1 file插件
用于将事件和日志行文件流式传输到Logstash,能自动检测文件旋转,并从上次读取的位置继续读取。
input{
file{
path => "/path/to/logfiles"
}
}
配置选项:
-
add_field
:添加字段到传入事件,类型为哈希,默认值为
{}
,例如
add_field => { "input_time" => "%{@timestamp}" }
-
codec
:指定编解码器,默认值为
"plain"
,如
codec => "json"
用于解码JSON类型输入
-
delimiter
:指定分隔符,默认值为
"\n"
-
exclude
:排除特定类型的文件,类型为数组,例如
path =>["/app/packtpub/logs/*"] exclude => "*.gz"
-
path
:必需配置,指定读取日志和事件的路径数组
-
sincedb_path
:指定
sincedb
文件的写入位置,默认值为
$HOME/.sincedb*
-
sincedb_write_interval
:指定
sincedb
文件的写入频率,默认值为15秒
-
start_position
:取值为
"beginning"
或
"end"
,指定从文件的开始或结尾开始读取,默认值为
"end"
-
tags
:添加标签到传入事件,类型为数组,例如
tags =>["processed"]
-
type
:为不同类型的输入流指定类型,方便后续过滤和处理,例如:
input {
file{
path => ["var/log/syslog/*"]
type => "syslog"
}
file{
path => ["var/log/apache/*"]
type => "apache"
}
}
4.2 stdin插件
用于从标准输入流式传输事件和日志行,常用于配置的初步测试。
stdin {
}
配置选项与
file
插件的
add_field
、
codec
、
tags
、
type
类似。
4.3 twitter插件
用于从Twitter流式API读取事件,需要在Twitter开发者API页面注册应用获取相关信息。
twitter {
consumer_key => "your consumer key here"
keywords => "keywords which you want to filter on streams"
consumer_secret => "your consumer secret here"
oauth_token => "your oauth token here"
oauth_token_secret => "your oauth token secret here"
}
配置选项:
-
add_field
、
codec
、
tags
、
type
与
file
插件类似
-
consumer_key
:必需配置,从Twitter应用注册页面获取
-
consumer_secret
:从Twitter开发者应用注册获取
-
full_tweet
:布尔值,默认值为
false
,指定是否记录完整推文对象
-
keywords
:必需配置,类型为数组,指定要跟踪的关键字
-
oauth_token
、
oauth_token_secret
:从Twitter开发者API页面获取
4.4 lumberjack插件
用于通过
lumberjack
协议接收事件,
lumberjack
或Logstash forwarder是轻量级的日志发送器。
lumberjack {
port =>
ssl_certificate =>
ssl_key =>
}
配置选项:
-
add_field
、
codec
、
tags
、
type
与
file
插件类似
-
host
:指定监听的主机,默认值为
"0.0.0.0"
-
port
:必需配置,指定监听的端口
-
ssl_certificate
:必需配置,指定SSL证书的路径
-
ssl_key
:必需配置,指定SSL密钥的路径
-
ssl_key_passphrase
:指定SSL密钥的密码
4.5 redis插件
用于从Redis实例读取事件和日志,Redis常用于ELK Stack中作为日志数据的代理。
redis {
}
配置选项:
-
add_field
、
codec
、
tags
、
type
与
file
插件类似
-
data_type
:取值为
"list"
、
"channel"
或
"pattern_channel"
-
host
:指定Redis服务器的主机名,默认值为
"127.0.0.1"
-
key
:指定Redis的键
-
password
:指定连接密码
-
port
:指定Redis实例运行的端口,默认值为6379
更多Logstash输入插件的详细信息可参考:https://www.elastic.co/guide/en/logstash/current/input-plugins.html
5. 输出插件
5.1 csv插件
用于将数据写入CSV文件,指定CSV文件的字段和路径。
csv {
fields => ["date","open_price","close_price"]
path => "/path/to/file.csv"
}
配置选项:
-
codec
:编码数据,默认值为
"plain"
-
csv_options
:指定CSV输出的高级选项,例如
csv_options => {"col_sep" => "\t" "row_sep" => "\r\n"}
-
fields
:必需配置,指定输出CSV文件的字段
-
gzip
:布尔值,指定是否以gzip压缩格式输出,默认值为
false
-
path
:必需配置,指定CSV文件的路径
5.2 file插件
用于将事件写入文件系统中的文件。
file {
path => "path/to/file"
}
配置选项包括
codec
、
gzip
、
max_size
、
path
。
5.3 email插件
用于在特定事件和故障场景下发送电子邮件。
email {
to => "abc@example.com"
}
配置选项:
-
attachments
:附件文件路径数组,默认值为
[]
-
body
:电子邮件的纯文本正文,默认值为
""
-
cc
:指定抄送的电子邮件列表
-
from
:指定发件人电子邮件地址,默认值为
"logstash.alert@nowhere.com"
-
to
:必需配置,指定收件人电子邮件地址
-
htmlbody
:指定电子邮件的HTML正文
-
replyto
:指定回复电子邮件的地址
-
subject
:指定电子邮件的主题,默认值为
""
5.4 elasticsearch插件
是ELK Stack中最重要的插件,用于将输出写入Elasticsearch以便后续在Kibana中分析。
elasticsearch {
}
部分重要配置选项如下:
| 选项 | 数据类型 | 是否必需 | 默认值 |
| ---- | ---- | ---- | ---- |
| action | 字符串 | 否 | “index” |
| bind_host | 字符串 | 否 | |
| bind_port | 数字 | 否 | |
| cacert | 有效系统路径 | 否 | |
| cluster | 字符串 | 否 | |
| document_id | 字符串 | 否 | |
| document_type | 字符串 | 否 | |
| host | 数组 | 否 | |
| index | 字符串 | 否 | “logstash-%{+YYYY.MM.dd}” |
| max_retries | 数字 | 否 | 3 |
| node_name | 字符串 | 否 | |
| password | 密码 | 否 | |
| port | 字符串 | 否 | |
| user | 字符串 | 否 | |
5.5 ganglia插件
用于将日志事件中的指标发送到Ganglia的
gmond
服务。
ganglia {
metric =>
value =>
}
配置选项:
-
metric
:指定用于性能监控的指标
-
unit
:指定指标的单位
-
value
:指定指标的值
5.6 jira插件
可通过
bin/plugin install logstash-output-jira
命令安装,用于将事件发送到JIRA实例以创建JIRA工单。
jira {
issuetypeid =>
password =>
priority =>
projectid =>
summary =>
username =>
}
配置选项:
| 选项 | 数据类型 | 是否必需 |
| ---- | ---- | ---- |
| assignee | 字符串 | 否 |
| issuetypeid | 字符串 | 是 |
| password | 字符串 | 是 |
| priority | 字符串 | 是 |
| projectid | 字符串 | 是 |
| reporter | 字符串 | 否 |
| summary | 字符串 | 是 |
| username | 字符串 | 是 |
5.7 kafka插件
用于将特定事件写入Kafka的主题。
kafka {
topic_id =>
}
必需配置为
topic_id
,指定要发送消息的主题。
5.8 lumberjack插件
用于将输出写入Logstash forwarder或
lumberjack
。
lumberjack {
hosts =>
port =>
ssl_certificate =>
}
配置选项:
-
hosts
:指定
lumberjack
可以发送消息的地址列表
-
port
:指定连接
lumberjack
通信的端口
-
ssl_certificate
:指定用于通信的SSL证书路径
5.9 redis插件
用于将事件发送到Redis实例,配置选项与
redis
输入插件类似。
5.10 rabbitmq插件
用于将日志事件推送到RabbitMQ交换器。
rabbitmq {
exchange =>
exchange_type =>
host =>
}
5.11 stdout插件
用于将输出事件写入控制台,常用于调试配置。
output {
stdout {}
}
5.12 mongodb插件
可通过
bin/plugin install logstash-output-mongodb
命令安装,用于将数据写入MongoDB。
mongodb {
collection =>
database =>
uri =>
}
配置选项:
-
collection
:指定要写入数据的MongoDB集合
-
database
:指定要使用的MongoDB数据库
-
uri
:指定连接MongoDB的字符串
更多Logstash输出插件的详细信息可参考:https://www.elastic.co/guide/en/logstash/current/output-plugins.html
以下是Logstash输入和输出插件的使用流程图:
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;
A([开始]):::startend --> B{选择输入插件}:::decision
B -->|file| C(配置file插件):::process
B -->|stdin| D(配置stdin插件):::process
B -->|twitter| E(配置twitter插件):::process
B -->|lumberjack| F(配置lumberjack插件):::process
B -->|redis| G(配置redis插件):::process
C --> H(数据输入):::process
D --> H
E --> H
F --> H
G --> H
H --> I{选择输出插件}:::decision
I -->|csv| J(配置csv插件):::process
I -->|file| K(配置file插件):::process
I -->|email| L(配置email插件):::process
I -->|elasticsearch| M(配置elasticsearch插件):::process
I -->|ganglia| N(配置ganglia插件):::process
I -->|jira| O(配置jira插件):::process
I -->|kafka| P(配置kafka插件):::process
I -->|lumberjack| Q(配置lumberjack插件):::process
I -->|redis| R(配置redis插件):::process
I -->|rabbitmq| S(配置rabbitmq插件):::process
I -->|stdout| T(配置stdout插件):::process
I -->|mongodb| U(配置mongodb插件):::process
J --> V(数据输出):::process
K --> V
L --> V
M --> V
N --> V
O --> V
P --> V
Q --> V
R --> V
S --> V
T --> V
U --> V
V --> W([结束]):::startend
6. 过滤插件
过滤插件用于对从输入插件读取的事件进行中间处理,然后再通过输出插件输出。它们常用于识别输入事件中的字段,并根据条件处理输入事件的某些部分。
6.1 csv过滤插件
用于解析传入的CSV文件中的数据,并将值分配给字段。其配置选项在之前的示例中已有介绍。
6.2 date过滤插件
在ELK中,为事件分配正确的时间戳非常重要,这样才能在Kibana中基于时间进行过滤分析。date过滤插件用于根据日志或事件中的字段分配适当的时间戳,并为时间戳指定正确的格式。如果未设置date过滤插件,Logstash将在首次看到事件或读取文件时分配时间戳。
date {
}
其配置选项在之前的示例中已有介绍。
6.3 drop过滤插件
用于丢弃符合该过滤条件的所有内容。
filter {
if [fieldname == "test"] {
drop {
}
}
}
上述过滤将导致所有包含
test
字段名的事件被丢弃,这有助于过滤掉输入事件中的无用信息。
配置选项包括:
-
add_field
-
add_tag
-
remove_field
-
remove_tag
6.4 geoip过滤插件
用于添加传入事件中IP地址的地理位置信息,该信息从Maxmind数据库获取。Maxmind是一家专门从IP地址获取有用信息的公司,GeoIP是其用于追踪IP地址位置的IP智能产品。所有Logstash版本都附带了Maxmind的GeoLite城市数据库,也可从http://dev.maxmind.com/geoip/legacy/geolite/获取。
geoip {
source =>
}
配置选项:
-
source
:必需配置,字符串类型,用于指定要通过geoip服务映射的IP地址或主机名。事件中包含IP地址或主机名的任何字段都可以提供,如果字段是数组类型,则只取第一个值。
6.5 grok过滤插件
是Logstash中最流行和最强大的插件,它可以解析任何非结构化的日志事件,并将其转换为结构化的字段集,以便进一步处理和分析。它可用于解析任何类型的日志,如Apache日志、MySQL日志、自定义应用程序日志或事件中的任何非结构化文本。
Logstash默认附带了一组grok模式,可直接用于标记某些类型的字段,也支持自定义正则表达式。所有可用的grok模式可在https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns查看。
grok模式的通用格式为:
%{SYNTAX:SEMANTIC}
,其中
SYNTAX
是匹配日志中文本的模式名称,
SEMANTIC
是要分配给该模式的字段名。
例如,要表示一个事件中传输的字节数:
%{NUMBER:bytes_transferred}
,这里
bytes_transferred
将引用日志事件中实际传输的字节数。
对于HTTP日志行
54.3.245.1 GET /index.html 14562 0.056
,grok模式表示为:
%{IP:client_ip} %{WORD: request_method } %{URIPATHPARAM:uri_path} %{NUMBER:bytes_transferred} %{NUMBER:duration}
基本的grok配置如下:
filter{
grok{
match => { "message" =>"%{IP:client_ip} %{WORD:request_method} %{URIPATHPARAM:uri_path} %{NUMBER:bytes_transferred} %{NUMBER:duration}"}
}
}
处理后,事件将添加以下字段和值:
-
client_ip
:
54.3.245.1
-
request_method
:
GET
-
uri_path
:
/index.html
-
bytes_transferred
:
14562
-
duration
:
0.056
如果现有的grok模式列表中没有所需的模式,可以根据正则表达式创建自定义grok模式。可使用http://grokdebug.herokuapp.com和http://grokconstructor.appspot.com/设计和测试grok模式。
6.6 mutate过滤插件
是一个重要的过滤插件,用于重命名、删除、替换和修改传入事件中的字段。还可用于转换字段的数据类型、合并两个字段、将文本从小写转换为大写等。
filter {
mutate {
}
}
配置选项:
| 选项 | 数据类型 | 是否必需 | 默认值 |
| ---- | ---- | ---- | ---- |
| add_field | 哈希 | 否 | {} |
| add_tag | 数组 | 否 | [] |
| convert | 哈希 | 否 | |
| join | 哈希 | 否 | |
| lowercase | 数组 | 否 | |
| merge | 哈希 | 否 | |
| remove_field | 数组 | 否 | [] |
| remove_tag | 数组 | 否 | [] |
| rename | 哈希 | 否 | |
| replace | 哈希 | 否 | |
| split | 哈希 | 否 | |
| strip | 数组 | 否 | |
| update | 哈希 | 否 | |
| uppercase | 数组 | 否 | |
6.7 sleep过滤插件
用于让Logstash在指定的时间内进入睡眠模式,还可以根据事件数量指定睡眠间隔的频率。
例如,要让Logstash每处理5个事件就睡眠1秒,可以这样配置:
filter {
sleep {
time => "1" # Sleep 1 second
every => 5 # Sleep on every 5th event.
}
}
更多Logstash过滤插件的详细信息可参考:https://www.elastic.co/guide/en/logstash/current/filter-plugins.html
7. 编解码器插件
编解码器插件用于对Logstash的传入或传出事件进行编码或解码,它们在输入和输出插件中充当流过滤器。
7.1 json编解码器插件
如果输入事件或输出事件包含完整的JSON文档,则json编解码器插件很有用。
input{
stdin{
codec => json{
}
}
}
或简单定义为:
input{
stdin{
codec => "json"
}
}
7.2 line编解码器插件
用于将输入中的每一行作为一个事件读取,或将每个传出事件解码为一行。
input{
stdin{
codec => line{
}
}
}
或简单定义为:
input{
stdin{
codec => "line"
}
}
7.3 multiline编解码器插件
对于某些需要将多行作为一个事件处理的情况非常有用,例如Java异常或堆栈跟踪。
例如,以下配置可以将完整的堆栈跟踪作为一个事件处理:
input {
file {
path => "/var/log/someapp.log"
codec => multiline {
pattern => "^%{TIMESTAMP_ISO8601} "
negate => true
}
}
}
以下是Logstash过滤和编解码器插件的使用流程图:
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;
A([开始]):::startend --> B{选择过滤插件}:::decision
B -->|csv| C(配置csv过滤插件):::process
B -->|date| D(配置date过滤插件):::process
B -->|drop| E(配置drop过滤插件):::process
B -->|geoip| F(配置geoip过滤插件):::process
B -->|grok| G(配置grok过滤插件):::process
B -->|mutate| H(配置mutate过滤插件):::process
B -->|sleep| I(配置sleep过滤插件):::process
C --> J(事件过滤处理):::process
D --> J
E --> J
F --> J
G --> J
H --> J
I --> J
J --> K{选择编解码器插件}:::decision
K -->|json| L(配置json编解码器插件):::process
K -->|line| M(配置line编解码器插件):::process
K -->|multiline| N(配置multiline编解码器插件):::process
L --> O(事件编码/解码):::process
M --> O
N --> O
O --> P([结束]):::startend
综上所述,Logstash提供了丰富的插件来收集、解析、转换和传输数据,通过合理配置这些插件,可以构建强大的日志分析和事件处理系统。在实际应用中,可根据具体需求选择合适的插件,并进行相应的配置和调整。
超级会员免费看
3548

被折叠的 条评论
为什么被折叠?



