我一直在摸着头几个小时,我有点沮丧。我是新手,所以我可能做错了,但经过几个小时的工作,我无法弄清楚是什么。我使用 chef-logstash cookbook 配置了代理商和服务器。
我设置了两个系统,一个代理和一个服务器。 代理会读取文件,对其进行过滤,然后将其发送到服务器上的redis实例。 服务器从redis中获取传入条目,并在elasticsearch中对其进行索引(使用 embedded )。
这是我的问题,我可以使用如下所示的简单配置,输入服务器的输入,一切都发送到服务器,就好了。 / p>
input { stdin { } }
output {
redis {
host => "192.168.33.11"
data_type => "list"
key => "logstash"
codec => json
}
stdout { codec => rubydebug }
}
通过我的服务器(在vagrant中)运行的logstash正确地获取所有内容,它们会被编入索引,我可以在Kibana中看到它们。
代理商是另一个故事。在我的代理上,从3个配置文件input_file_nginx.conf
,output_stdout.conf
,output_redis.conf
开始。我发现日志没有在我的服务器上找到我的redis,所以我试图缩小它的范围。当我查看我的代理上的日志时,我真的很困惑。据我所知,没有人读书。无论是那个,还是我的output_stdout.conf
搞砸了。
这是我的input_file_nginx.conf
input {
file {
path => "/home/silkstart/logs/*.log"
type => "nginx"
}
}
作为参考,其中的两个文件是nginx.silkstart.80.access.log
和nginx.silkstart.80.error.log
,两者都具有644
权限,因此应该是可读的。
我的output_stdout.conf
output {
stdout {
codec => rubydebug
}
}
这些都是使用某些erbs的logstash_config
生成的。
我的实例几乎逐字逐句地来自agent.rb
示例
logstash_service name do
action [:enable]
method "runit"
end
这是结果配置
#!/bin/sh
cd //opt/logstash/agent
exec 2>&1
# Need to set LOGSTASH_HOME and HOME so sincedb will work
LOGSTASH_HOME="/opt/logstash/agent"
GC_OPTS=""
JAVA_OPTS="-server -Xms198M -Xmx596M -Djava.io.tmpdir=$LOGSTASH_HOME/tmp/ "
LOGSTASH_OPTS="agent -f $LOGSTASH_HOME/etc/conf.d"
LOGSTASH_OPTS="$LOGSTASH_OPTS --pluginpath $LOGSTASH_HOME/lib"
LOGSTASH_OPTS="$LOGSTASH_OPTS -vv"
LOGSTASH_OPTS="$LOGSTASH_OPTS -l $LOGSTASH_HOME/log/logstash.log"
export LOGSTASH_OPTS="$LOGSTASH_OPTS -w 1"
HOME=$LOGSTASH_HOME exec chpst -u logstash:logstash $LOGSTASH_HOME/bin/logstash $LOGSTASH_OPTS
这与我的服务器配置非常相似,可以使用
#!/bin/sh
ulimit -Hn 65550
ulimit -Sn 65550
cd //opt/logstash/server
exec 2>&1
# Need to set LOGSTASH_HOME and HOME so sincedb will work
LOGSTASH_HOME="/opt/logstash/server"
GC_OPTS=""
JAVA_OPTS="-server -Xms1024M -Xmx218M -Djava.io.tmpdir=$LOGSTASH_HOME/tmp/ "
LOGSTASH_OPTS="agent -f $LOGSTASH_HOME/etc/conf.d"
LOGSTASH_OPTS="$LOGSTASH_OPTS --pluginpath $LOGSTASH_HOME/lib"
LOGSTASH_OPTS="$LOGSTASH_OPTS -l $LOGSTASH_HOME/log/logstash.log"
export LOGSTASH_OPTS="$LOGSTASH_OPTS -w 1"
HOME=$LOGSTASH_HOME exec chpst -u logstash:logstash $LOGSTASH_HOME/bin/logstash $LOGSTASH_OPTS
我能看到的唯一区别是
ulimit -Hn 65550
ulimit -Sn 65550
但是我不明白为什么要阻止这种做法。这会增加文件描述符的数量,但默认的4096应该是充足的。
当向服务器发出一些请求以确保日志中有新内容时,我检查了runit日志,它只指向/opt/logstash/agent/log/logstash.log
,我已粘贴https://gist.github.com/jrstarke/384f192abdd93c0acf2a的内容
如果我sudo su logstash
并从命令行运行bin/logstash -f etc/conf.d
,那么事情就会发生变化。
非常感谢任何帮助。
答案 0 :(得分:2)
我设法解决了这个问题。对于其他遇到类似问题的人,您需要检查您尝试访问的文件的权限。
如果您正在访问通过组权限访问的文件,那么您可能会面临同样的问题。
仔细看看这一行
exec chpst -u logstash:logstash
这告诉我们,我们希望以用户logstash运行程序,并使用组权限logstash。就我而言,我想要使用的组是另一组。 chpst的文档注意到
如果group由冒号分隔的组名列表组成,则chpst设置所有列出的组的组ID。
因此,如果我想将user1
和group1
同时作为group2
运行,那么该命令就会变为
exec chpst -u user1:group1:group2
我希望这可以帮助其他遇到同样问题的人。