同福

LogStash安装笔记

介绍

介绍

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

由于Logstash基于JAVA,JAVA是出了名的吃内存,所以我们尽量只部署一个Logstash环境,收集工作就交给Filebeat来负责。

基本信息

安装环境

CentOS:CentOS Linux release 7.6.1810 (Core)
Linux:Linux version 3.10.0-1062.el7.x86_64
GCC:gcc version 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)

软件版本

logstash-7.2.0.tar.gz

验证时间

2020/01/07

准备工作

本地化

如果是新环境,我们需要设置时区以保证时间显示正确

timedatectl set-timezone Asia/Shanghai

安装wget

如果环境里没有wget,通过yum安装一下

yum -y install wget

建立环境根目录

mkdir -p /tongfu.net/env/

建立安装包目录并进入

mkdir /packages
cd /packages

安装Logstash7

下载

logstash

下载页面

https://www.elastic.co/cn/downloads/logstash

下载软件

wget https://artifacts.elastic.co/downloads/logstash/logstash-7.2.0.tar.gz

JDK

必须通过网页下载,需要勾选“接受协议”,所以不能用wget直接下载了!

网页地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

安装

JDK

tar -xzvf jdk-8u192-linux-x64.tar.gz -C /tongfu.net/env/

logstash

直接解压缩即可

tar -xzvf logstash-7.2.0.tar.gz -C /tongfu.net/env/

配置

配置JDK

echo "export JAVA_HOME=/tongfu.net/env/jdk1.8.0_192" >> /etc/profile
echo "export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar" >> /etc/profile
source /etc/profile

设置JVM参数

[root@tongfunet]# vi /tongfu.net/env/logstash-7.2.0/config/jvm.options

-Xms1g
-Xmx1g

使用

通过文件输入

通过监听本地文件的内容变化,增量读取数据

一般情况下,我们不会把 logstash 和应用程序安装到一起,所以这种情况比较少见

可以设置多组文件进行监听

[root@tongfunet]# vi /tongfu.net/env/logstash-7.2.0/config/test.conf

input {
    file {
        path => "/tongfu.net/logs/nginx-1.12.2/logs/access.log"
        codec => json
    }
}

通过 beats 输入

通过建立 beats 服务端口,被动接收数据

这种情况的使用场景比较广泛,配合 filebeat 进行数据的多渠道收集集中处理

可以设置多组 beats 监听多个端口

[root@tongfunet]# vi /tongfu.net/env/logstash-7.2.0/config/test.conf

input {
    beats {
        port => "5044"
        codec => json
    }
}

输出到 ElasticSearch

采集到的数据经过加工处理后就可以存储起来了

一般情况下,存储到 ElasticSearch 是比较广泛的做法  

[root@tongfunet]# vi /tongfu.net/env/logstash-7.2.0/config/test.conf

output {
    elasticsearch {
        hosts => ["http://10.16.1.111:9200"]
        index => "test_log"
    }
}

过滤

通过 filter 关键字对输入数据进行加工处理

[root@tongfunet]# vi /tongfu.net/env/logstash-7.2.0/config/test.conf

filter {
    mutate {
    
    }
    grok {
    
    }
    geoip {
    
    }
    ...
}

启动

我们通过下面的命令启动logstash

参数config.reload.automatic用来启动自动配置文件重新加载,因为logstash启动过程非常的慢,所以每次修改配置文件后让logstash自己重新加载配置文件,这样可以节省很多时间

cd /tongfu.net/env/logstash-7.2.0/
./bin/logstash -f ./config/test.conf --config.reload.automatic

完整的启动命令

载入环境变量,后台运行logstash,并写入日志

source /etc/profile
nohup /tongfu.net/env/logstash-7.2.0/bin/logstash -f /tongfu.net/env/logstash-7.2.0/config/logstash.conf --config.reload.automatic > /tongfu.net/env/logstash-7.2.0/logs/logstash.log 2>&1 &

Filter

在 filter 内部编写数据加工处理逻辑,可以包含 mutate、geoip 等等

可以使用 if 条件编写不同数据的不同加工处理逻辑

Grok

通过 grok 进行数据的正则表达式替换

Mutate

通过 mutate 进行修改数据字段,添加数据字段,数据转换

语法

add_field

添加新字段到结果数据

add_field => {
    "new_field" => "%{[some_field]}"
    "new_field2" => "%{[some_parent_field][some_child_field]}"
}

remove_field

删除结果数据的现有字段

remove_field => ["agent", "input"]

if

使用条件语句

if [host] == "apache2" {
    file {
        path => "/var/log/apache2.log"
    }
}
if [host] == "nginx" {
    file {
        path => "/var/log/nginx.log"
    }
}

使用 in 语法

if "access.log" in [log][file] {
    file {
        path => "/var/log/access.log"
    }
}
if "error.log" in [log][file] {
    file {
        path => "/var/log/error.log"
    }
}

GeoIP

安装GeoIP

安装软件

yum -y install geoip

下载数据库

wget https://geolite.maxmind.com/download/geoip/database/GeoLite2-City.tar.gz

安装数据库

tar -xzvf GeoLite2-City.tar.gz
cp GeoLite2-City_20190723/GeoLite2-City.mmdb /usr/share/GeoIP/

更新数据库

geoipupdate

配置示例

标准配置示例

这里我们提供一个标准的配置文件示例,基本满足大部分需求

# 提供两个 beats 5044 5045
# 5044 用来接收json数据
# 5045 用来接收普通文本
input {
    beats {
        add_field => {"data_type"=>"json"}
        port => "5044"
        codec => json
    }
    beats {
        add_field => {"data_type"=>"text"}
        port => "5045"
    }
}

# 过滤器
# json数据单独处理
# text数据单独处理
filter {
    if [data_type] == "json" {
        mutate {
        
        }
        geoip {
        
        }
        ...
    }
    if [data_type] == "text" {
        ...
    }
}

# 输出
# json类型数据的access.log文件数据存储到索引access_log里
# json类型数据的error.log文件数据存储到索引error_log里
# text类型数据丢弃
output {
    if [type] == "json" and "access.log" in [log_file] {
        elasticsearch {
            hosts => ["http://10.16.1.111:9200"]
            index => "access_log"
        }
    }
    if [type] == "json" and "error.log" in [log_file] {
        elasticsearch {
            hosts => ["http://10.16.1.112:9200"]
            index => "error_log"
        }
    }
}

常见错误

常见错误1

错误信息:

URI is not valid - host is not specified

原因:

输出到 elasticsearch 的主机不能使用域名,换成 IP 地址即可解决