Linux 日志存储文件输入无法读取文件

Linux 日志存储文件输入无法读取文件,linux,file,chef-infra,logstash,Linux,File,Chef Infra,Logstash,几个小时来我一直在为这件事挠头,我有点沮丧。我是logstash的新手,所以我可能做错了什么,但在做了几个小时的工作后,我不知道是什么。我使用配置了代理和服务器 我设置了两个系统,一个代理和一个服务器。代理读取文件,过滤它们,然后将它们发送到服务器上的redis实例。服务器从redis获取传入条目,并在elasticsearch(使用嵌入式)中为它们编制索引 这是我的问题,我可以使用下面这样一个简单的配置,输入服务器,然后所有内容都发送到服务器,很好 input { stdin { } } ou

几个小时来我一直在为这件事挠头,我有点沮丧。我是logstash的新手,所以我可能做错了什么,但在做了几个小时的工作后,我不知道是什么。我使用配置了代理和服务器

我设置了两个系统,一个代理和一个服务器代理读取文件,过滤它们,然后将它们发送到服务器上的redis实例。服务器从redis获取传入条目,并在elasticsearch(使用嵌入式)中为它们编制索引

这是我的问题,我可以使用下面这样一个简单的配置,输入服务器,然后所有内容都发送到服务器,很好

input { stdin { } }
output {
  redis {
    host => "192.168.33.11"
    data_type => "list"
    key => "logstash"
    codec => json
  }
  stdout { codec => rubydebug }
}
我的服务器上运行的logstash(在vagrant中)正确地提取了所有内容,它们被索引,我可以在Kibana中看到它们

代理是另一回事。在我的代理上,从3个配置文件开始,
input\u file\u nginx.conf
output\u stdout.conf
output\u redis.conf
。我发现日志无法到达我的服务器上的redis,所以我尝试缩小它的范围。当我在我的代理上查看日志时,我感到非常困惑。据我所知,没有人读到任何东西。或者我的
输出_stdout.conf
出错了

这是我的
输入文件\u nginx.conf

input {
  file {
    path => "/home/silkstart/logs/*.log"
    type => "nginx"
  }
}
output {
  stdout {
    codec => rubydebug
  }
}
作为参考,其中的两个文件是
nginx.silkstart.80.access.log
nginx.silkstart.80.error.log
,它们都具有
644
权限,因此应该是可读的

和我的
output\u stdout.conf

input {
  file {
    path => "/home/silkstart/logs/*.log"
    type => "nginx"
  }
}
output {
  stdout {
    codec => rubydebug
  }
}
这些都是使用一些ERB的
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应该足够了

当我向服务器发出一些请求以确保日志中有新的内容,并且我检查了运行日志时,它只会指向我粘贴了at的内容的
/opt/logstash/agent/log/logstash.log

要真正解决问题,如果我
sudosulogstash
并从命令行运行
bin/logstash-f etc/conf.d
,一切都会正常工作


任何帮助都将不胜感激。

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

如果您正在访问通过组权限访问的文件,那么您可能会遇到与我相同的问题

仔细看这条线

exec chpst-u logstash:logstash

这告诉我们,我们希望以用户logstash的身份运行一个程序,并具有组权限logstash。在我的例子中,我想使用的组是另一个组。chpst的文件指出

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

因此,如果我想以
user1
的身份运行程序,同时使用
group1
group2
,则该命令将变为

exec chpst-u user1:group1:group2


我希望这能帮助其他遇到与我相同问题的人。

这个问题似乎有关联