关于logstash同步服务器日志的问题分析
程序员文章站
2022-05-26 15:14:27
...
一.问题描述
生产应用使用了两台服务器(后面叫服务器1、2),es和kibana搭建在另外一台服务器(后面叫服务器3)上,一共三台服务器。计划是将logstash搭建在es和kibana那一台上,集中管理。所以现在的问题是如何在服务器3上同步到服务器1、2的日志?
二.方法1
查阅资料发现,logstash也支持类似集群的方式。在一台机器上搭建server端,另外的搭成client端。将client的日志同步到server端即可。具体配置如下:
服务端conf:
input {
tcp {
mode => "server"
port => 9600
ssl_enable => false
}
}
filter {
json {
source => "message"
}
}
output {
file {
path => "/opt/lampp/crm_ceshi/logECO/%{+YYYY-MM-dd}/%{servip}-%{filename}"
codec => line { format => "%{message}"}
}
}
客户端conf:
input{
file {
path => ["/opt/lampp/crm_ceshi/logECO/2018-10-30/agreeRefundToElemeV2.txt"]
type => "ecolog"
start_position => "beginning"
sincedb_path => "/opt/tmp/logstash-6.4.2/data/plugins/inputs/file/.sincedb_3f3dc7129f441b61d81b1acadb65ed4e"
}
}
filter {
if [type] =~ /^ecolog/ {
ruby {
code => "file_name = event.get('path').split('/')[-1]
event.set('file_name',file_name)
event.set('servip','客户端IP')"
}
mutate {
rename => {"file_name" => "filename"}
}
}
}
output {
tcp {
host => "服务端ip"
port => 9600
codec => json_lines
}
}
由于我这边机器不多,所以没有考虑这种方式。
三.方法2
写个定时脚本,在每台机器上定时同步日志文件到服务器3。其实也是一个可行的办法,因为定时脚本可以设置时间,如果设置的时间短点的话,应该也是可以满足一定需求的。而且脚本也不复杂,scp加cron基本搞定。由于时效不好控制,赞没有采用。
四.方法3
每台机器都同一搭建logstash,然后直接往对应的es上送。想来想去,这样可以减少集群模式下server端的搭建,同时互不影响。就采用这种方式了。具体配置比较简单,如下:
input {
file{
path => ['/app/logs/myapp/2021*/*.log']
type => 'elasticsearch'
codec => "json"
start_position => "beginning"
}
}
output {
elasticsearch {
hosts => ["http://xx.xx.xx.xx:9201"]
index => "myapp-log-%{+YYYY.MM.dd}"
}
}
五.另外遇到的一个关于启动的问题
使用如下命令启动:
./bin/logstash -f ./config/myconf.conf &
发现可以同步,日志也能送到es,但是一旦退出服务器控制台,再次进入发现:后续的日志并没有再同步。所以logstash还是只能每天去定时启动吗??
使用如下命令:
ps -ef|grep logstash
发现,这个logstash进程是一直在的,可是为什么没有一直同步呢?具体我也没有弄清楚,但是找到了解决办法,杀掉logstash的进程(kill -9)后,使用如下命令启动
nohup ./bin/logstash -f ./config/myconf.conf &
关掉控制台,去kibana中发现也可以同步日志了。至此问题解决