logstash-介绍

339 阅读4分钟

1. logstash简介

Logstash是一个开源数据收集引擎,具有实时管道功能。Logstash可以动态地将来自不同数据源的数据统一起来,并将数据标准化到你所选择的目的地。

image.png

Logstash是一个开源的服务器端数据处理管道,可以同时从多个数据源获取数据,并对其进行转换,然后将其发送到你最喜欢的“存储”。(当然,我们最喜欢的是Elasticsearch)

1.1 输入

  • 输入:采集各种样式、大小和来源的数据 image.png

数据往往以各种各样的形式,或分散或集中地存在于很多系统中。Logstash 支持各种输入选择 ,可以在同一时间从众多常用来源捕捉事件。能够以连续的流式传输方式,轻松地从您的日志、指标、Web 应用、数据存储以及各种 AWS 服务采集数据.

1.2 过滤器

  • 过滤器:实时解析和转换数据

数据从源传输到存储库的过程中,Logstash 过滤器能够解析各个事件,识别已命名的字段以构建结构,并将它们转换成通用格式,以便更轻松、更快速地分析和实现商业价值。

image.png

1.3 输出

  • 输出:选择你的存储,导出你的数据

尽管 Elasticsearch 是我们的首选输出方向,能够为我们的搜索和分析带来无限可能,但它并非唯一选择。 Logstash 提供众多输出选择,您可以将数据发送到您要指定的地方,并且能够灵活地解锁众多下游用例。

image.png

2. logstash安装

# 下载包
wget https://artifacts.elastic.co/downloads/logstash/logstash-5.6.1.tar.gz -o /opt/logstash-5.6.1.tar.gz

# 解压
tar xf /opt/logstash-5.6.1.tar.gz -C /usr/local
  • 验证
cd  /usr/local/logstash-5.6.1

./bin/logstash -e 'input { stdin{} } output { stdout{} } '

如果展示的一下就为正常,手动输入字符串会打印出来一定格式的数据:

image.png

3. logstash几种使用

运行logstash的时候可以指定加载的文件:

./bin/logstash -f xxxx.conf

3.1 标准

  • 创建文件 demo01.conf
input { 
    stdin {
    } 
} 
output { 
    stdout{
    } 
}

输入:采用标准的控制台输入, 输出:将采集的日志输出到控制台

  • 运行
./bin/logstash -f demo01.conf

3.2 读取文件

  • 创建文件 demo03_file.conf
input {
	file {
		path => "/var/log/nginx/host.access.log"
	}
}
output {
	stdout{}
}

输入:实时读取nginx的日子文件, 输出:将采集的日志输出到控制台

  • 运行
./bin/logstash -f demo03_file.conf

3.3 读取数据库数据

input {
	jdbc {
      		jdbc_connection_string => "jdbc:mysql://node03.xhiteam.com:3306/test?useSSL=false&characterEncoding=utf-8"
      		jdbc_user => "root"
     		jdbc_password => "xxxxxx"
      		jdbc_driver_library => "/data/logstash-7.15.1/config/conf/mysql-connector-java-8.0.16.jar"
     		jdbc_driver_class => "com.mysql.jdbc.Driver"
     		statement => "select * from user"
      		schedule => "* * * * *"
    }
}
output{
	stdout{}
}

输入:每分钟执行sql语句读取数据库中的数据, 输出:将采集的日志输出到控制台

3.4 读取myqsl中增量数据

  • 创建文件 demo05_jdbc.conf
input {
        jdbc {
                jdbc_connection_string => "jdbc:mysql://node03.xhiteam.com:3306/test?useSSL=false&characterEncoding=utf-8"
                jdbc_user => "root"
                jdbc_password => "xxxxxx"
                jdbc_driver_library => "/data/logstash-7.15.1/config/conf/mysql-connector-java-8.0.16.jar"
                jdbc_driver_class => "com.mysql.jdbc.Driver"
                schedule => "* * * * *"
		jdbc_paging_enabled => "true"
      		jdbc_page_size => "500"
		use_column_value => true
		tracking_column => "create_time"
		tracking_column_type => "numeric"
		last_run_metadata_path => "/data/logstash-7.15.1/config/conf/station.txt"
		clean_run => false
		statement => "select * from user where create_time > :sql_last_value order by create_time asc"
    }
}
output{
        stdout{}
}

输入:每分钟执行sql语句,并读取的数据根据create_time判断增量数据, 输出:将采集的日志输出到控制台

3.5 输出json格式的数据

  • 创建文件 demo06_out_stdout.conf
input {
	file {
		path => "/var/log/nginx/host.access.log"
	}
}
output {
	stdout {
		codec => json
		id => "id1"
	}
}

输入:实时读取nginx的日志文件, 输出:将采集的日志采用json的格式输出到控制台

3.6 将查询的mysql数据,输出到es中

  • 创建文件 demo07_out_es.conf
input {
        jdbc {
                jdbc_connection_string => "jdbc:mysql://node03.xhiteam.com:3306/test?useSSL=false&characterEncoding=utf-8"
                jdbc_user => "root"
                jdbc_password => "xxxxxx"
                jdbc_driver_library => "/data/logstash-7.15.1/config/conf/mysql-connector-java-8.0.16.jar"
                jdbc_driver_class => "com.mysql.jdbc.Driver"
                schedule => "* * * * *"
		jdbc_paging_enabled => "true"
      		jdbc_page_size => "500"
		use_column_value => true
		tracking_column => "create_time"
		tracking_column_type => "numeric"
		last_run_metadata_path => "/data/logstash-7.15.1/config/conf/station.txt"
		clean_run => false
		statement => "select * from user where create_time > :sql_last_value order by create_time asc"
    }
}
output {
	stdout {
	}
	elasticsearch {
		action => "index"
		hosts=>["192.168.64.129:9200"]
		user=>"elastic"
		password=>"elastic"
		index=>"log_demo07"
		document_id=>"%{id}"
	}
}

输入:每分钟执行sql语句读取数据, 输出:将采集的日志输出到es中,并且es中的文档id采用数据id

3.7 添加filter

  • 创建文件 demo08_filter_grok.conf
input{ stdin{} }

filter{
	grok{
		match => { "message" => "%{IP:remote_address}" }
	
	}
}

output{	
    stdout{} 
}

输入:标准输入, 输出:标准输出。 过滤器:采用grok插件只要输入的中匹配到了IP格式的文本,则在输出的数据中添加字段remote_address

3.8 自定义过滤器的匹配规则

  • 创建文件 demo09_filter_grok2.conf
input{ stdin{} }

filter{
	grok{
		match => { "message" => "(?<email>([A-Za-z0-9])+\@([A-Za-z0-9\.])+\.([A-Za-z]{2,4}))" }
	
	}
}

output{	
    stdout{} 
}

输入:标准输入, 输出:标准输出。 过滤器:采用grok插件只要输入的中匹配到了自定义的正则规则,则在输出的数据中添加字段email字段

3.8 自定义过滤器加载规则文件

  • 创建规则文件夹 patterns

  • 进入patterns ,创建文件my_patterns 文件my_patterns的内容如下:

MYEMAIL ([A-Za-z0-9])+\@([A-Za-z0-9\.])+\.([A-Za-z]{2,4})
  • 创建文件 demo10_filter_grok2.conf
input{ stdin{} }

filter{
	grok{
		patterns_dir => ["/data/logstash-7.15.1/config/conf/patterns"]
		match => { "message" => "%{IP:remote_address} %{MYEMAIL:my_email}" }
	
	}
}

output{	stdout{} }

过滤器:采用加载自定义的正则规则文件夹,则在输出的数据中添加字段email字段

4. 其他

-www.elastic.co/guide/en/lo…

- https://www.cnblogs.com/cpy-devops/p/9287531.html

- https://www.cnblogs.com/cjsblog/p/9459781.html