在實驗中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之間的連接是正常響應的。