1 官网
https://www.elastic.co/guide/en/logstash/current/index.html
2 安装
2.1 上传
logstash-2.3.1.tar.gz
2.2 解压
tar -zxvf logstash-2.3.1.tar.gz
mv logstash-2.3.1 logstash
3 first demo
通过命令执行logstash的进程:
To test your Logstash installation, run the most basic Logstash pipeline. For example:
cd logstash-7.6.1
./bin/logstash -e 'input { stdin { } } output { stdout {} }'
出现命令后方可进行数据采集的操作
After starting Logstash, wait until you see "Pipeline main started" and then enter hello world at the command prompt:
在输出 "Pipeline main started" 后输入单词即可看到输出。
简写的方式
./bin/logstash -e ""
当生产消息到logstash的时候,logstash是把消息封装到一个json中,默认带了很多字段:
./bin/logstash -e ""
发送消息:
hello world
接收到的消息:
{
"message" => "hello world",
"@version" => "1",
"@timestamp" => "2020-03-24T13:35:59.884Z",
"type" => "stdin",
"host" => "0.0.0.0"
}
4 logstash工作原理
Logstash使用管道方式进行日志的搜集处理和输出。有点类似*NIX系统的管道命令 xxx | ccc | ddd,xxx执行完了会执行ccc,然后执行ddd。
在logstash中,包括了三个阶段:
输入input --> 处理filter(不是必须的) --> 输出output

写一个配置文件 input output 也可以包含filter,然后通过logstash加载这个配置文件运行。
5 书写logstash的通用模板
5.1 第一个例子,监听端口的
input {
beats {
port => "5044"
}
}
# The filter part of this file is commented out to indicate that it is
# optional.
# filter {
#
# }
output {
stdout { codec => rubydebug }
}
5.2 启动方式
bin/logstash -f first-pipeline.conf --config.test_and_exit
5.3 第一个程序
1)在logstash的目录下创建文件夹
mkdir myconf
2) vi first-file.conf
input {
file {
#指定监听的文件路径,注意必须是绝对路径
path => "/home/hadoop/apps/nginx/logs/access.log"
start_position => beginning
}
}
filter {
}
output {
stdout {}
}
3)启动worker,进程
./bin/logstash -f myconf/first-file.conf
5.4 配置解释start_position
1、logstash会记住已经消费的文件的位置,下次读取的时候会自动切换到之前读取的位置,一旦已经消费过了就不在消费;
flume会出现重复消费的问题;
2、在读取旧的日志文件的时候,可以配置从头读还是从尾部读。
beginning和end的区别
都不会去消费历史记录,但是历史有没有消费过的消息,beginning会去消费。
Choose where Logstash starts initially reading files: at the beginning or at the end. The default behavior treats files like live streams and thus starts at the end. If you have old data you want to import, set this to beginning.
6 最常用的input插件——file。
这个插件可以从指定的目录或者文件读取内容,输入到管道处理,也算是logstash的核心插件了,大多数的使用场景都会用到这个插件,因此这里详细讲述下各个参数的含义与使用。
6.1 最小化的配置文件
在Logstash中可以在 input{} 里面添加file配置,默认的最小化配置如下:
input {
file {
path => "E:/software/logstash-1.5.4/logstash-1.5.4/data/*"
}
}
filter {
}
output {
stdout {}
}
当然也可以监听多个目标文件:
input {
file {
path => ["E:/software/logstash-1.5.4/logstash-1.5.4/data/*","F:/test.txt"]
}
}
filter {
}
output {
stdout {}
}
6.2 其他的配置
另外,处理path这个必须的项外,file还提供了很多其他的属性:
input {
file {
#监听文件的路径
path => ["E:/software/logstash-1.5.4/logstash-1.5.4/data/*","F:/test.txt"]
#排除不想监听的文件
exclude => "1.log"
#添加自定义的字段
add_field => {"test"=>"test"}
#增加标签
tags => "tag1"
#设置新事件的标志
delimiter => "\n"
#设置多长时间扫描目录,发现新文件
discover_interval => 15
#设置多长时间检测文件是否修改
stat_interval => 1
#监听文件的起始位置,默认是end
start_position => beginning
#监听文件读取信息记录的位置
sincedb_path => "E:/software/logstash-1.5.4/logstash-1.5.4/test.txt"
#设置多长时间会写入读取的位置信息
sincedb_write_interval => 15
}
}
filter {
}
output {
stdout {}
}
其中值得注意的是:
1 path
是必须的选项,每一个file配置,都至少有一个path
2 exclude
是不想监听的文件,logstash会自动忽略该文件的监听。配置的规则与path类似,支持字符串或者数组,但是要求必须是绝对路径。
3 start_position
是监听的位置,默认是end,即一个文件如果没有记录它的读取信息,则从文件的末尾开始读取,也就是说,仅仅读取新添加的内容。对于一些更新的日志类型的监听,通常直接使用end就可以了;相反,beginning就会从一个文件的头开始读取。但是如果记录过文件的读取信息,这个配置也就失去作用了。
4 sincedb_path
这个选项配置了默认的读取文件信息记录在哪个文件中,默认是按照文件的inode等信息自动生成。其中记录了inode、主设备号、次设备号以及读取的位置。因此,如果一个文件仅仅是重命名,那么它的inode以及其他信息就不会改变,因此也不会重新读取文件的任何信息。类似的,如果复制了一个文件,就相当于创建了一个新的inode,如果监听的是一个目录,就会读取该文件的所有信息。
5 其他的关于扫描和检测的时间,按照默认的来就好了,如果频繁创建新的文件,想要快速监听,那么可以考虑缩短检测的时间。
6 add_field
就是增加一个字段,例如:
input{
file {
add_field => {"test"=>"test"}
path => "/home/hadoop/apps/nginx/logs/access.log"
start_position => beginning
}
}
output{
stdout{
codec => rubydebug
}
}
# 输出日志为:
{
"message" => "1585072313.574^A192.168.18.1^A^A^A^A^A^A^A^A^AMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36^A^A",
"@version" => "1",
"@timestamp" => "2020-03-24T17:53:45.664Z",
"path" => "/home/hadoop/apps/nginx/logs/access.log",
"host" => "mini6",
"test" => "test"
}
7 logstash与kafka对接
-- 查看所有的topic
kafka-topics.sh --list --zookeeper mini3:2181
-- 消费某个topic
kafka-console-consumer.sh --zookeeper mini3:2181 --topic order129 --from-beginning
##7.1 部署配置
生产者与broker相连;消费者与zookeeper相连。有了这样的对应关系,就容易部署logstash–>kafka–>logstash的方案
7.2.启动kafka
启动zookeeper:
$zookeeper/bin/zkServer.sh start
启动kafka:
$kafka/bin/kafka-server-start.sh $kafka/config/server.properties &
7.3.创建主题
创建主题:
$kafka/bin/kafka-topics.sh --zookeeper mini3:2181 --create --topic hello --replication-factor 1 --partitions 1
查看主题:
$kafka/bin/kafka-topics.sh --zookeeper mini3:2181 --describe
7.4.测试环境
执行生产者脚本:
kafka-console-producer.sh --broker-list mini3:9092 --topic order129
执行消费者脚本,查看是否写入:
kafka-console-consumer.sh --zookeeper mini3:2181 --from-beginning --topic order129
7.5.向kafka中输出数据
input{
stdin{}
}
output{
kafka{
topic_id => "order129"
bootstrap_servers => "mini3:9092,mini4:9092,mini5:9092"
# kafka的地址
batch_size => 5
codec => plain {
format => "%{message}"
charset => "UTF-8"
}
}
stdout{
codec => rubydebug
}
}
#启动
./bin/logstash -f myconf/outputkafka.conf
7.6.从kafka中读取数据
logstash配置文件:
input{
kafka {
codec => "plain"
group_id => "logstash1"
auto_offset_reset => "smallest"
reset_beginning => true
topic_id => "order129"
zk_connect => "mini3:2181"
}
}
output{
stdout{
codec => rubydebug
}
}
# 启动
./bin/logstash -f myconf/kafkainput.conf