ELK------Logstash的部署
- 1 logstash简介
- 1.1 Logstash的原理
- 1.2 执行模型
- 2 logstash的部署
- 3 标准输入和标准输出
- 3.1 多行过滤插件
- 3.2 grok过滤插件(将信息分开显示)
1 logstash简介
Elasticsearch是当前主流的分布式大数据存储和搜索引擎,可以为用户提供强大的全文本检索能力,广泛应用于日志检索,全站搜索等领域。Logstash作为Elasicsearch常用的实时数据采集引擎,可以采集来自不同数据源的数据,并对数据进行处理后输出到多种输出源,是Elastic Stack 的重要组成部分。
1.1 Logstash的原理
Logstash的数据处理过程主要包括:Inputs, Filters, Outputs 三部分, 另外在Inputs和Outputs中可以使用Codecs对数据格式进行处理。这四个部分均以插件形式存在,用户通过定义pipeline配置文件,设置需要使用的input,filter,output, codec插件,以实现特定的数据采集,数据处理,数据输出等功能
(1)Inputs:用于从数据源获取数据,常见的插件如file, syslog, redis, beats 等
(2)Filters:用于处理数据如格式转换,数据派生等,常见的插件如grok, mutate, drop, clone, geoip等[详细参考]
(3)Outputs:用于数据输出,常见的插件如elastcisearch,file, graphite, statsd等
(4)Codecs:Codecs不是一个单独的流程,而是在输入和输出等插件中用于数据转换的模块,用于对数据进行编码处理,常见的插件如json,multiline
ogstash 的主要优势:在支持各类插件的前提下提供统一的管道进行日志处理( input-filter-output )
1.2 执行模型
- 每个Input启动一个线程,从对应数据源获取数据
- Input会将数据写入一个队列:默认为内存中的有界队列(意外停止会导致数据丢失)。为了防止数丢失Logstash提供了两个特性:
Persistent Queues: 通过磁盘上的queue来防止数据丢失
Dead Letter Queues: 保存无法处理的event(仅支持Elasticsearch作为输出源) - Logstash会有多个pipeline worker, 每一个pipeline
worker会从队列中取一批数据,然后执行filter和output(worker数目及每次处理的数据量均由配置确定)
2 logstash的部署
(1)安装jdk的环境:rpm -ivh jdk-8u181-linux-x64.rpm
(2)安装logstash:rpm -ivh logstash-7.6.1.rpm
(3)设置环境变量
vim .bash_profile
- 使修改立刻生效:
source .bash_profile
3 标准输入和标准输出
使用Logstash管道来测试一下安装的Logstash。Logstash管道有两个必需的元素,输入和输出,以及一个可选元素过滤器。输入插件从数据源那里消费数据,过滤器插件根据你的期望修改数据,输出插件将数据写入目的地。
(1)Logstash最基本的管道(命令方式)
logstash -e 'input { stdin {} } output { stdout{} } '
# -e 允许从命令行指定配置
(2)Logstash的管道(通过文件的方式)
- 监听文件变化,记录一个叫.sincedb的数据库文件来跟踪被监听的日志文件的当前读取位
vim /etc/logstash/conf.d/test.conf
bash
input {
stdin {}
}
output {
stdout {}
}
logstash -f /etc/logstash/conf.d/test.conf
(3)标准输出到文件
vim /etc/logstash/conf.d/test.conf
input {
stdin {}
}
output {
stdout {}
file {
path => "/mnt/testfile"
codec => line { format => "custom format : %{message}" }
}
}
logstash -f /etc/logstash/conf.d/test.conf
- 测试:
cat /mnt/testfile
(4)标准输入到文件
vim /etc/logstash/conf.d/test.conf
input {
file {
path => "/mnt/testfile"
start_position => "beginning"
}
}
output {
stdout {}
# file {
# path => "/mnt/testfile"
# codec => line { format => "custom format : %{message}" }
# }
}
logstash -f /etc/logstash/conf.d/test.conf
vim /etc/logstash/conf.d/test.conf
input {
file {
path => "/var/log/messages"
start_position => "beginning"
}
}
output {
stdout {}
# file {
# path => "/mnt/testfile"
# codec => line { format => "custom format : %{message}" }
# }
elasticsearch{
hosts =>["172.25.12.1:9200"]
index => "syslog-%{+yyyy.MM.dd}"
}
}
logstash -f /etc/logstash/conf.d/test.conf
server3和server4开放远程
- 编辑配置文件:
vim /etc/rsyslog.conf
- 重启服务:
systemctl restart rsyslog.service
- 编辑配置文件:
vim /etc/logstash/conf.d/test.conf
input
{
# file {
# path => "/var/log/messages"
# start_position => "beginning"
# }
syslog {} ## 收集日志信息,默认监听514端口
}
output {
stdout {}
# file {
# path => "/mnt/testfile"
# codec => line { format => "custom format : %{message}" }
# }
elasticsearch{
hosts =>["172.25.12.1:9200"] ## 主机
index => "messages-%{+yyyy.MM.dd}"
}
}
logstash -f /etc/logstash/conf.d/test.conf
3.1 多行过滤插件
多行过滤可以把多行日志记录合并为一行事件
编辑文件:vim /etc/logstash/conf.d/mutli.conf
input {
file {
path=> "/var/log/my-es.log"
start_position => "beginning"
codec => multiline {
pattern => "^\["
negate => true
what => previous
}
}
}
output {
# stdout {}
elasticsearch{
hosts =>["172.25.12.1:9200"]
index => "my-es-%{+yyyy.MM.dd}"
}
}
执行:logstash -f /etc/logstash/conf.d/mutli.conf
3.2 grok过滤插件(将信息分开显示)
server5:安装apache服务
压测:ab -c1 -n 100 http://172.25.12.5/index.html
编辑文件:/etc/logstash/conf.d/apache.conf
input {
file {
path => "/var/log/httpd/access_log"
start_position => "beginning"
}
# syslog {}
}
output {
stdout {}
# file {
# path => "/mnt/testfile"
# codec => line { format => "custom format : %{message}" }
# }
elasticsearch{
hosts =>["172.25.12.1:9200"]
index => "apache-%{+yyyy.MM.dd}"
}
}
执行:logstash -f /etc/logstash/conf.d/apache.conf
删除日志文件
编辑文件:/etc/logstash/conf.d/apache.conf
input {
file {
path => "/var/log/httpd/access_log"
start_position => "beginning"
}
# syslog {}
}
filter {
grok {
match => { "message" => "%{HTTPD_COMBINEDLOG}" }
}
}
output {
stdout {}
# file {
# path => "/mnt/testfile"
# codec => line { format => "custom format : %{message}" }
# }
elasticsearch{
hosts =>["172.25.12.1:9200"]
index => "apache-%{+yyyy.MM.dd}"
}
}
执行: logstash -f /etc/logstash/conf.d/apache.conf