最近使用elk来管理网络项目的访问log,其中Elasticsearch 和 Kibana由公司系统提供,logstash需要自己搭建,项目的访问log首先发送到kafka,然后由logstash从kafka收集log发送到Elasticsearch进行分析展示。记录一下logstash的搭建配置过程。
安装
#下载并安装公共签名密钥:
sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
#在目录/etc/yum.repos.d/下添加一个后缀为.repo的文件
sudo vim /etc/yum.repos.d/logstash.repo
#内容如下:
[logstash-7.x]
name=Elastic repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
#安装logstash
sudo yum install logstash
#或者,使用wget https://artifacts.elastic.co/downloads/logstash/logstash-7.4.0.tar.gz 直接下载
配置
使用yum安装的logstash的配置文件位于目录/etc/logstash/下面,可以在这里创建default.conf,jaas.conf, kafka.truststore.jks文件。
其中jaas.conf记录kafka的用户名、密码等信息,kafka.truststore.jks也是用于kafka的验证配置。
具体配置文件如下:
#输入:kafka的配置,这个是我们项目的kafka的参数,不同的项目的设置可能不同,根据具体的kafka配置
input {
kafka {
bootstrap_servers => "10.110.203.10:29091, 10.110.203.10:29092"
#topics_pattern这个配置表示匹配所有以test-开头的topic
topics_pattern => "test-.*"
group_id => "test"
decorate_events => true
jaas_path => "/etc/logstash/jaas.conf"
security_protocol => "SASL_SSL"
sasl_kerberos_service_name => "kafka"
sasl_mechanism => "SCRAM-SHA-512"
ssl_truststore_location => "/etc/logstash/kafka.truststore.jks"
ssl_truststore_password => "kafka-passwd"
ssl_endpoint_identification_algorithm => ""
}
}
filter {
#message是个json的字符串(log信息主体),这个filter负责把字符串解析成json对象,并且移除之前的message字段
json {
source => "message"
remove_field => ["message"]
}
#将user agent字符串解析为结构化数据
useragent {
target => "ua"
source => "userAgent"
}
}
#输出,elasticsearch的配置
output {
elasticsearch {
hosts => ["https://10.110.203.10:12000"]
#这个index设置表示以kafka的topic作为elasticsearch的index
index => "%{[@metadata][kafka][topic]}"
user => "user"
password => "password"
}
}
将上述文件存储为/etc/logstash/default.conf, 然后使用命令sudo /usr/share/logstash/bin/logstash -f /etc/logstash/default.conf
启动logstash。
另外,jaas.conf文件内容格式如下(用户名密码参照kafka安装设置的用户名密码,如果没有的话,可以不设置jaas_path,如果没有使用ssl加密的话,可以不设置ssl_truststore_location):
KafkaClient {
org.apache.kafka.common.security.scram.ScramLoginModule required
username="test"
password="123456";
};
精简之后的kafka的配置如下:
#其中decorate_events会将kafka的属性写到metadata里面
kafka {
bootstrap_servers => "10.110.203.10:29091, 10.110.203.10:29092"
topics_pattern => "test-.*"
group_id => "test"
decorate_events => true
}
metadata在最后输出的结果里面的样子大概如下:
#注意这个不是我们之前配置的logstash文件输出的结果,我们之前配置的把message字段删除转换成了json对象,这个只是使用log信息为test的字符串演示一下metadata的结构
{
"@timestamp" => 2019-10-17T07:52:25.973Z,
"@metadata" => {
"kafka" => {
"consumer_group" => "logstash",
"partition" => 0,
"offset" => 9,
"timestamp" => 1571298744915,
"topic" => "test",
"key" => nil
},
},
"@version" => "1",
"message" => "test",
}
假设我们不想使用kafka的topic作为elasticsearch的index,而是只想使用一部分的话,比如我们的topic都是test-开头的,如test-dev-com,test-beta-com等,我们只想使用dev,beta等作为最后的index,那么可以使用grok来进行处理,配置如下:
filter {
#从[@metadata][kafka][topic]中提取出topic并取中间段作为[@metadata][topic],然后将elasticsearch的index配置为index => "%{[@metadata][topic]}"即可
grok {
match => {"[@metadata][kafka][topic]" => "(?<[@metadata][topic]>(?<=test-)(.*)(?=-com)/?)"}
}
}
做测试的时候可以将input配置为标准输入,output配置为标准输出,这样可以更为直观的观察结果:
input {
stdin{}
}
output {
stdout {codec => rubydebug { metadata => true }}
}