[英]Indexing logs with Elasticsearch Logstash (using preprocessing Python script)
我对Elasticsearch Logstash有问题。 我的目标是使用logstash自动将日志发送到elasticsearch。
我的原始日志如下所示:
2016-09-01T10:58:41+02:00 INFO (6): 165.225.76.76 entreprise1 email1@gmail.com POST /application/controller/action Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko {"getid":"1"} 86rkt2dqsdze5if1bqldfl1
2016-09-01T10:58:41+02:00 INFO (6): 165.225.76.76 entreprise2 email2@gmail.com POST /application/controller2/action2 Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko {"getid":"2"} 86rkt2rgdgdfgdfgeqldfl1
2016-09-01T10:58:41+02:00 INFO (6): 165.225.76.76 entreprise3 email3@gmail.com POST /application/controller2/action2 Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko {"getid":"2"}
问题是我不想以这种形式插入日志。 我想在python中使用预处理脚本,以便在使用logstash注入Elastic之前转换数据。
开始时,我只想使用python脚本登录elasticsearch。 但是我有大量的日志分散在许多文件夹和文件中,并不断更新,因此我认为使用logstash或filebeat的功能更强大。 我正在尝试使用filebeat和gork过滤器(不足以满足我的情况),但是我认为在记录之前无法使用预处理脚本。
日志应该在python脚本的末尾看起来像这样:
{"page": "/application/controller/action", "ip": "165.225.76.76", "browser": "Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko", "action": "action", "client": "entreprise1", "email": "email1@gmail.com", "feature": "application_controller_action", "time": "2016-09-01 10:58:41", "method": "POST", "controller": "controller", "application": "application"}
{"page": "/application/controller2/action2", "ip": "165.225.76.76", "browser": "Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko", "action": "action2", "client": "entreprise2", "email": "email2@gmail.com", "feature": "application_controller2_action2", "time": "2016-09-01 10:58:41", "method": "POST", "controller": "controller2", "application": "application"}
{"page": "/application3/controller/action3", "ip": "165.225.76.76", "browser": "Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko", "action": "action3", "client": "entreprise3", "email": "email3@gmail.com", "feature": "application_controller3_action3", "time": "2016-09-01 10:58:41", "method": "POST", "controller": "controller3", "application": "application"}
我在logstash过滤器中努力实现python脚本。 我知道这是可以实现的,但是基本上它是用ruby脚本完成的(cf: https : //www.elastic.co/guide/en/logstash/current/plugins-filters-ruby.html )
1)您认为可以使用logstash解决我的问题吗?
2)如果是,我的python脚本应将原始日志行作为输入,并将json格式化的行作为输出?
3)当在日志文件中添加一行日志时,每次都会重新插入整个文件,我该如何处理?
4)您认为可以使用filebeat做到吗? 根据您的说法,最适合我的情况是什么?
现在,我的配置logstash文件如下所示:
input {
file {
path => "/logpath/logs/*/*.txt"
start_position => "beginning"
}
}
filter {
# Here is where I should use my script to transform my logs into my json needed format
date {
match => ["time", "YYYY-MM-dd HH:mm:ss" ]
}
geoip {
source => "ip"
target => "geoip"
}
}
output {
stdout {
codec => dots {}
}
elasticsearch {
index => "logs_index"
document_type => "logs"
template => "./logs_template.json"
template_name => "logs_test"
template_overwrite => true
}
}
我真的要在此先感谢任何可以帮助我并考虑我的要求的人。
迪米特里
PS:抱歉,语法不是我的主要语言。
将日志转换为json格式的标准方法是在logstash配置中使用grok,json过滤器。 为了减少Logstash上的负载以处理日志文件拍子,可以将其与配置一起使用。
因此,可以解决此问题的最佳配置是filebeat-> logstash-> Elasticsearch堆栈。
您不需要python脚本,而是使用filebeat捕获特定位置的所有日志并将其转发到logstash。
在累积了所有日志的服务器上安装filebeat,如果将所有日志定向到特定的文件夹中会很好。 首先安装filebeat,然后设置配置以将日志转发到logstash
这是filebeat配置:
filebeat:
prospectors:
-
paths:
- "*log_path_of_all_your_log_files*"
input_type: log
json.message_key: statement
json.keys_under_root: true
idle_timeout: 1s
registry_file: /var/lib/filebeat/registry
output:
logstash:
hosts: ["*logstash-host-ip:5044*"]
worker: 4
bulk_max_size: 1024
shipper:
logging:
files:
rotateeverybytes: 10485760 # = 10MB
level: debug
现在,在这里,连同您的logstash配置一起,您需要具有GROK过滤器才能将您的日志转换为json格式(在logstash配置文件中进行更改),然后将其转发到elasticsearch kibana或任何您想要的地方。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.