logstash文件输入无法读取文件

时间:2014-11-29 15:54:04

标签: linux file chef logstash

我一直在摸着头几个小时,我有点沮丧。我是新手,所以我可能做错了,但经过几个小时的工作,我无法弄清楚是什么。我使用 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.confoutput_stdout.confoutput_redis.conf开始。我发现日志没有在我的服务器上找到我的redis,所以我试图缩小它的范围。当我查看我的代理上的日志时,我真的很困惑。据我所知,没有人读书。无论是那个,还是我的output_stdout.conf搞砸了。

这是我的input_file_nginx.conf

input {
  file {
    path => "/home/silkstart/logs/*.log"
    type => "nginx"
  }
}

作为参考,其中的两个文件是nginx.silkstart.80.access.lognginx.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,那么事情就会发生变化。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

我设法解决了这个问题。对于其他遇到类似问题的人,您需要检查您尝试访问的文件的权限。

如果您正在访问通过组权限访问的文件,那么您可能会面临同样的问题。

仔细看看这一行

exec chpst -u logstash:logstash

这告诉我们,我们希望以用户logstash运行程序,并使用组权限logstash。就我而言,我想要使用的组是另一组。 chpst的文档注意到

  

如果group由冒号分隔的组名列表组成,则chpst设置所有列出的组的组ID。

因此,如果我想将user1group1同时作为group2运行,那么该命令就会变为

exec chpst -u user1:group1:group2

我希望这可以帮助其他遇到同样问题的人。