Logstash除非世界可读,否则不会读取日志

我最近用Kibana和Elasticsearch设置了Logstash,但是有一个问题,它不读日志,除非目录权限是世界读/执行(至less是世界读取的文件)。

我已经从RPM中安装了版本1.4.2,它以logstash用户身份运行。 我已经确定logstash用户是与需要读取的日志有关的组的成员,例如“apache”。

[root@rhel-00081 conf]# id logstash uid=497(logstash) gid=497(logstash) groups=48(apache),10081(nexus),27666(spark),497(logstash) 

/ var / log / http上的默认权限是drwxr-x--- root apache ,但Logstash将不会处理日志,直到将其更改为drwxr-xr-x

任何想法,为什么这是?

好的,我发现了这个问题。 RPM中提供的init脚本启动logstash,如下所示:

 nice -n ${LS_NICE} chroot --userspec $LS_USER:$LS_GROUP / sh -c " cd $LS_HOME ulimit -n ${LS_OPEN_FILES} exec \"$program\" $args " > "${LS_LOG_DIR}/$name.stdout" 2> "${LS_LOG_DIR}/$name.err" & 

但是,在chroot命令下运行时,除非您提供–groups选项,否则将删除所有辅助组成员资格。 你可以看到这个如果你运行:

 [root@rhel-00081 ~]# chroot --userspec logstash:logstash / bash -c "id" uid=497(logstash) gid=497(logstash) groups=497(logstash),0(root) 

因此,Apache的日志是不可读的…

 [root@rhel00081 httpd]# chroot --userspec logstash:logstash / bash -c "cat /var/log/httpd/access_log" cat: /var/log/httpd/access_log: Permission denied 

init脚本中的chroot行需要在前面加上类似的内容:

 SUPP_GROUPS=$(groups $LS_USER | cut -d " " -f 4- | tr " " ",") SUPP_GROUP_STR="" if [ ! -z ${SUPP_GROUPS} ] then SUPP_GROUP_STR="--groups=${SUPP_GROUPS}" fi 

然后修改chroot行的开头:

 nice -n ${LS_NICE} chroot ${SUPP_GROUP_STR} --userspec=$LS_USER:$LS_GROUP / sh -c " ... etc ... 

这是logstash 1.4.2 init脚本中的一个已知问题。 https://github.com/elastic/logstash/pull/1398