本篇概要:
1. 安装 Logstash;
# 下载和 Elasticsearch 相同版本
cd /usr/local/src
wget https://artifacts.elastic.co/downloads/logstash/logstash-7.5.0.tar.gz
# 解压到指定安装目录
tar zxvf logstash-7.5.0.tar.gz -C /usr/local/logstash
# 按需修改配置文件
vim /usr/local/logstash/config/logstash.yml
# 设置名称
node.name: master-1
# 设置远程访问
http.host: "0.0.0.0"
2. 调试;
- 以下为基本的 Logstash 管道来测试 Logstash 设置
2.1 标准输出;
# 启动
cd /usr/local/logstash
bin/logstash -e 'input { stdin { } } output { stdout {} }'
# 当出现 Successfully started Logstash API endpoint {:port=>9600},启动成功
# 控制台输入:hello world
# logstash 处理后会在控制台输出:
{
"message" => "hello world",
"@version" => "1",
"@timestamp" => 2019-12-25T05:21:20.995Z,
"host" => "hua-PC"
}
2.2 标准输出至 ElasticSearch;
bin/logstash -e 'input { stdin { } } output { elasticsearch { hosts => ["localhost:9200"] } stdout {} }'
# 启动成功后,控制台输入:hello world
# logstash 处理后会在控制台输出:
{
"@timestamp" => 2019-12-25T05:22:09.561Z,
"@version" => "1",
"message" => "hello world",
"host" => "hua-PC"
}
进入 ElasticSearch 查看,数据已经写入(下图)
2.3 使用配置文件;
- 场景 1:通过配置文件、监听指定目录下的文件,读取文件内容做标准输出
# 新建配置文件
cd /usr/local/logstash
vim test.conf
# 写入如下内容
input {
file { path => "/usr/local/logstash/test.txt" }
}
output {
stdout {}
}
# 保存退出,重启 logstash
bin/logstash -f test.conf
# 新开一个控制台,往 /usr/local/logstash/test.txt 文件里写内容
vim /usr/local/logstash/test.txt
# 写入字符串:hello world
# 保存退出
# 回到启动 logstash 的控制台,控制台输出:
{
"path" => "/usr/local/logstash/test.txt",
"message" => "hello world",
"@version" => "1",
"@timestamp" => 2019-12-24T05:45:23.743Z,
"host" => "hua-PC"
}
- 场景 2:通过配置文件、标准输出至 ElasticSearch
vim test2.conf
# 写入如下
input { stdin { } }
output {
elasticsearch { hosts => ["localhost:9200"] }
stdout {}
}
# 保存退出,重启 logstash
bin/logstash -f test2.conf
2.4 通过配置文件读取日志输出至 ElasticSearch;
- 场景:收集本机 Nginx 和 MySQL 日志
cd /usr/local/logstash
vim test3.conf
# 写入如下内容
input {
file {
path => "/usr/local/nginx/logs/error.log"
type => "nginx_error_log"
start_position => "beginning"
}
file {
path => "/usr/local/nginx/logs/access.log"
type => "nginx_access_log"
start_position => "beginning"
}
file {
path => "/data/mysql/log/mysqld.log"
type => "mysql_error_log"
start_position => "beginning"
}
}
output {
if [type] == "nginx_error_log" {
elasticsearch {
hosts => ["localhost:9200"]
index => "nginx_error_log-%{+YYYY.MM.dd}"
}
}
if [type] == "nginx_access_log" {
elasticsearch {
hosts => ["localhost:9200"]
index => "nginx_access_log-%{+YYYY.MM.dd}"
}
}
if [type] == "mysql_error_log" {
elasticsearch {
hosts => ["localhost:9200"]
index => "mysql_error_log-%{+YYYY.MM.dd}"
}
}
}
# 保存退出,重启 logstash
bin/logstash -f test3.conf
# 效果如下图
## 可能发生的问题:
# 第一次配置时,运行 Logstash 对日志文件进行的读取操作,然后输出到了 ElasticSearch
# 这个过程 Logstash 会记录自己读取完日志文件的位置,然后将自己读取内容的偏移量保存到一个隐藏文件 .sincedb_*
# 重启 Logstash 后从隐藏文件中的读取完成的日志文件位置知道,日志文件并没有发生改变
# 所以 Logstash 并没有对日志文件再次进行读取,所以控制台没有任何输出
# 解决方案 1:删除隐藏文件 隐藏文件 .sincedb_*
cd /usr/local/logstash/data/plugins/inputs/file
rm .sincedb_*
# 解决方案 2:input file 下配置 sincedb_path => "/dev/null"