logstash啟動失敗的問題追查


在實驗中logstash是作為日志過濾器的作用,日志收集使用的則是filebeat組件。redis作為緩存器,logstash從redis中拉取數據進行過濾並傳給elasticsearch組件。

但是logstash總是啟動失敗,還沒有報錯信息,因此追查起來異常艱難。

Jan 15 07:13:42 ip-172-31-22-29.ec2.internal systemd[1]: Unit logstash.service entered failed state.
Jan 15 07:13:42 ip-172-31-22-29.ec2.internal systemd[1]: logstash.service failed.
Jan 15 07:13:42 ip-172-31-22-29.ec2.internal systemd[1]: logstash.service holdoff time over, scheduling restart.
Jan 15 07:13:42 ip-172-31-22-29.ec2.internal systemd[1]: start request repeated too quickly for logstash.service
Jan 15 07:13:42 ip-172-31-22-29.ec2.internal systemd[1]: Failed to start logstash.
Jan 15 07:13:42 ip-172-31-22-29.ec2.internal systemd[1]: Unit logstash.service entered failed state.
Jan 15 07:13:42 ip-172-31-22-29.ec2.internal systemd[1]: logstash.service failed.

就像上面的這個樣子,什么也看不出來問題信息在哪。

今天我們來看一下logstash的一些用法:

1、查看配置文件:

logstash服務中,會去pipelines.yml中過濾數據,但這個文件的內容其實指向的是conf.d這個目錄,因此我們要在conf.d目錄下創建好配置文件,以備logstash服務來對數據進行使用。

2、我們在conf.d目錄下創建一個新文件並寫入一些信息

3、保存好之后我們就可以進行啟動了,但是啟動報錯了。

[root@:vg_adn_tidbCkhsTest: /etc/logstash]#systemctl status logstash
● logstash.service - logstash
   Loaded: loaded (/etc/systemd/system/logstash.service; disabled; vendor preset: disabled)
   Active: failed (Result: start-limit) since Tue 2019-01-15 07:23:33 UTC; 2s ago
  Process: 11144 ExecStart=/usr/share/logstash/bin/logstash --path.settings /etc/logstash (code=exited, status=1/FAILURE)
 Main PID: 11144 (code=exited, status=1/FAILURE)

Jan 15 07:23:32 ip-172-31-22-29.ec2.internal systemd[1]: Unit logstash.service entered failed state.
Jan 15 07:23:32 ip-172-31-22-29.ec2.internal systemd[1]: logstash.service failed.
Jan 15 07:23:33 ip-172-31-22-29.ec2.internal systemd[1]: logstash.service holdoff time over, scheduling restart.
Jan 15 07:23:33 ip-172-31-22-29.ec2.internal systemd[1]: start request repeated too quickly for logstash.service
Jan 15 07:23:33 ip-172-31-22-29.ec2.internal systemd[1]: Failed to start logstash.
Jan 15 07:23:33 ip-172-31-22-29.ec2.internal systemd[1]: Unit logstash.service entered failed state.
Jan 15 07:23:33 ip-172-31-22-29.ec2.internal systemd[1]: logstash.service failed.

報錯信息看不出來問題出在哪里。后來我按照下列步驟來進行檢查。

我們定位到這一行信息

這可以看出來systemctl start logstash觸發的是這一條命令進行啟動程序的。因此我們以這樣的方式進行啟動程序

 如果以這樣的方式進行啟動我們發現

[root@:vg_adn_tidbCkhsTest: /etc/logstash]#/usr/share/logstash/bin/logstash --path.settings /etc/logstash
Sending Logstash logs to /var/log/logstash which is now configured via log4j2.properties
[2019-01-15T07:22:16,497][FATAL][logstash.runner          ] Logstash could not be started because there is already another instance using the configured data directory.  If you wish to run multiple instances, you must change the "path.data" setting.
[2019-01-15T07:22:16,521][ERROR][org.logstash.Logstash    ] java.lang.IllegalStateException: Logstash stopped processing because of an error: (SystemExit) exit

這個報錯意思是說我之前已經啟動了一個logstash實例了,我又想起來使用的是nohup方式以后台啟動的,雖然沒有啟動成功,但是卻占用進程不放,因此我們找出來把他kill掉即可。

kill掉之后再次使用這個命令就可以啟動成功了,這個命令的功能跟下面這個比較類似:

/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/l.conf

可以看出結果是指定了-f選項就要指定詳細的配置文件,而指定--path.settings參數則是指定目錄,因為它會從pipelines.yml這個文件中去找文件。

4、后來查出原因為什么systemctl命令不能啟動logstash成功的原因是什么了,我們再使用systemctl命令啟動程序時,最好查看一下/var/log/messages這個日志信息。今天就捕捉到原因了:

原理是因為JAVA環境變量引起的問題,好吧,logstash使用RPM包安裝的,而JAVA使用的是tar包解壓縮的,環境變量沒有任何問題,可是這幾個組件總是說找不到環境變量。所以我認為java這個環境變量以后使用yum一鍵安裝最好了。如何還是想解壓縮的話,那就創建個硬鏈接,把java的bin目錄里面的各個二進制文件鏈接到/bin目錄里面,我發現這幾個組件總是到/usr/bin、/bin、/sbin、/usr/sbin這四個目錄下尋找環境變量(這四個路徑是Linux系統一開始安裝好的最原始的PATH變量),后面你新加的環境變量都沒有起作用。

 既然明白了錯誤在哪里,就知道了如何去修改它,所以我就在java目錄下創建一個硬鏈接,鏈接到/bin目錄下好了。

其實像java的程序,我們使用yum一鍵安裝最好了。

 5、像redis這樣的緩存,filebeat要使用,logstash也要使用,所以我們要看好這兩個服務分別與redis之間的連接是正常響應的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM