我正在尝试使用文档作为示例在集中式设置中使用logstash:
http://logstash.net/docs/1.2.2/tutorials/getting-started-centralized
我的web服务器上运行了logstash(作为索引器),redis,elasticsearch和独立kibana3。然后我需要在另一台服务器上运行logstash作为代理来收集apache日志并通过redis将它们发送到Web服务器。代理的数量会增加,日志会有所不同,但是现在我只想让它工作!
我需要将所有内容作为服务运行,以便重新启动后一切正常。所有服务器都在运行Ubuntu。
对于所有logstash实例(索引器和代理),我使用以下init脚本(Ubuntu版本,第二个要点):
https://gist.github.com/shadabahmed/5486949#file-logstash-ubuntu
为了将redis作为服务运行,我按照这里的说明进行操作:
http://redis.io/topics/quickstart(更正确地安装redis)
Elasticsearch也作为服务运行。
在Web服务器上,正在运行redis-cli
会返回PONG
。导航到正确的Elasticsearch URL会返回正确的JSON响应。导航到Kibana3网址给了我仪表板,但没有数据。 UFW设置为允许redis端口(目前来自任何地方)。
在Web服务器上,我的logstash.conf是:
input {
file {
path => "/var/log/apache2/access.log"
type => "apache-access"
sincedb_path => "/etc/logstash/.sincedb"
}
redis {
host => "127.0.0.1"
data_type => "list"
key => "logstash"
codec => json
}
}
filter {
grok {
type => "apache-access"
pattern => "%{COMBINEDAPACHELOG}"
}
}
output {
elasticsearch {
embedded => true
}
statsd {
# Count one hit every event by response
increment => "apache.response.%{response}"
}
}
从代理服务器,我可以成功telnet到Web服务器IP和redis端口。 logstash正在运行。 logstash.conf文件是:
input {
file {
path => "/var/log/apache2/shift.access.log"
type => "apache"
sincedb_path => "/etc/logstash/since_db"
}
stdin {
type => "example"
}
}
filter {
if [type] == "apache" {
grok {
pattern => "%{COMBINEDAPACHELOG}"
}
}
}
output {
stdout { codec => rubydebug }
redis { host => ["xx.xx.xx.xx"] data_type => "list" key => "logstash" }
}
如果我注释掉stdin
和stdout
行,我仍然无法得到结果。 logstash日志不会给我任何连接错误 - 只有关于已弃用的grok
设置格式的警告。
我也试过从命令行运行logstash(确保首先停止妖魔化服务)。 apache日志文件在终端中正确输出,所以我知道logstash正在正确访问日志。我可以编写随机字符串,并以正确的logstash格式输出。
网络服务器上的redis日志显示没有任何问题......
令人沮丧的是,这已经奏效了一次。来自stdin
的一条消息一直延伸到弹性搜索。在获得所有设置之后,这就是今天早上。从那以后,我没有运气,我不明白为什么!
任何提示/指示感激不尽......解决我的问题会阻止我撕掉更多的头发,这也会让我的妻子开心......
而不是填写评论......
感谢@Vor和@rutter,我已经确认运行logstash的用户可以读/写logstash.log文件。
我使用-vv运行代理,并使用例如:
填充日志{:timestamp=>"2013-12-12T06:27:59.754000+0100", :message=>"config LogStash::Outputs::Redis/@host = [\"XX.XX.XX.XX\"]", :level=>:debug, :file=>"/opt/logstash/logstash.jar!/logstash/config/mixin.rb", :line=>"104"}
然后我将随机文本输入到终端并获得stdout结果。但是,在AFTER终止logstash代理之前,我在日志中看不到任何内容。代理终止后,我在logstash.log中获得这样的行:
{:timestamp=>"2013-12-12T06:27:59.835000+0100", :message=>"Pipeline started", :level=>:info, :file=>"/opt/logstash/logstash.jar!/logstash/pipeline.rb", :line=>"69"}
{:timestamp=>"2013-12-12T06:29:22.429000+0100", :message=>"output received", :event=>#<LogStash::Event:0x77962b4d @cancelled=false, @data={"message"=>"test", "@timestamp"=>"2013-12-12T05:29:22.420Z", "@version"=>"1", "type"=>"example", "host"=>"Ubuntu-1204-precise-64-minimal"}>, :level=>:info, :file=>"(eval)", :line=>"16"}
{:timestamp=>"2013-12-12T06:29:22.461000+0100", :level=>:debug, :host=>"XX.XX.XX.XX", :port=>6379, :timeout=>5, :db=>0, :file=>"/opt/logstash/logstash.jar!/logstash/outputs/redis.rb", :line=>"230"}
但是当我在stdout中收到消息时,我在其他服务器上的redis中什么都没得到。然而,我可以telnet到另一台服务器上的正确端口,我在telnet中得到“ping / PONG”,因此另一台服务器上的redis正在工作.....并且redis日志中没有错误等。
在我看来,非常喜欢logstash托运代理上的redis插件没有按预期工作,但对于我的生活,我无法看到故障来自哪里.....