問題描述
根據logstash的配置方法寫了一個配置文件,並放入/etc/logstash/conf.d/目錄下,然后我們運行logstash
# service logstash start Logstash started.
# service logstash status Redirecting to /bin/systemctl status logstash.service ● logstash.service - logstash Loaded: loaded (/etc/systemd/system/logstash.service; disabled; vendor preset: disabled) Active: active (running) since Thu 2018-04-19 16:51:23 CST; 22h ago Main PID: 2772 (java)
程序已經啟動,啟動后,ES並沒有收集到預期的日志信息,
查看/var/log/logstash/logstash.log只有Logstash啟動信息,沒有日志相關的信息。
然后停止logstash使用,logstash -f /etc/logstash/conf.d 方式再次啟動logstash進行測試,
結果ES可以收到相關的日志
也就是說以服務的方式啟動logstash,/etc/logstash/conf.d下的配置文件不生效,使用-f參數指定配置文件是生效的!!
問題分析過程
1. 首先查看了使用服務方式啟動時的進程參數

通過與手動啟動的方式對比並沒有什么區別,但結果卻不同,於是我們追溯使用服務方式啟動時的具體環境參數和命令
2. 分析/etc/init.d/logstash的啟動過程
通過第1點的分析,我們追溯到服務的啟動環境可能是導致結果不一樣的原因,
而在CentOS7中的啟動是由/etc/systemd/system/logstash.service控制的,
所以我們分析該腳本中的啟動代碼:

打開啟動文件
[Unit] Description=logstash [Service] Type=simple User=logstash Group=logstash # Load env vars from /etc/default/ and /etc/sysconfig/ if they exist. # Prefixing the path with '-' makes it try to load, but if the file doesn't
# exist, it continues onward. EnvironmentFile=-/etc/default/logstash EnvironmentFile=-/etc/sysconfig/logstash ExecStart=/usr/share/logstash/bin/logstash "--path.settings" "/etc/logstash" Restart=always WorkingDirectory=/ Nice=19 LimitNOFILE=16384 [Install] WantedBy=multi-user.target
我們使用手動命令直接在bash中以root用戶執行上述命令同樣是有效的,Logstash正確工作,
所以我們幾乎確認是由於logstash的默認執行用戶(logstash)權限不足導致的。
3. 修改文件屬主和權限方法
1.將配置文件權限修改為777
# chmod 777 /etc/logstash/conf.d/logstash.conf
2.將修改屬主為logstash
1、2測試結果 都失敗
4. 修改啟動文件——直接以root用戶運行(成功)
logstash是以logstash用戶啟動的
我們將其修改為root,
修改前
[Unit] Description=logstash [Service] Type=simple User=logstash Group=logstash # Load env vars from /etc/default/ and /etc/sysconfig/ if they exist.
修改后
[Unit] Description=logstash [Service] Type=simple User=root Group=root # Load env vars from /etc/default/ and /etc/sysconfig/ if they exist.
重新加載 systemctl 服務
# systemctl daemon-reload
重啟 logstash
# service logstash restart