graylog是一個小型的開源日誌收集、分析、展示框架。
主要graylog運行需要mongo、elasticsearch,所以他們就組成了一個小的整體。一般在虛擬機上搭建,可以分開安裝部署,但是既然是一個日誌服務,而且想盡量整理的簡單一些,所以考慮直接使用docker容器的方式,而直接一個一個docker run,還是顯得很複雜,主要是他們需要做一些配置,而且三個容器之間,graylog依賴於mongo、elasticsearch,還不能先啓動graylog。索性就整理一個docker-compose.yml文件,把他們三個一起部署,然後每次要修改配置或者重啓就方便很多。
如下是根據一些資料整理的一個簡潔的docker-compose.yml配置:
version: '2'
services:
mongodb:
container_name: mongodb
image: mongo:3
restart: always
volumes:
- /data/graylog/mongo_data:/data/db
es:
image: docker.elastic.co/elasticsearch/elasticsearch-oss:6.8.5
container_name: es
restart: always
volumes:
- /data/graylog/es_data:/usr/share/elasticsearch/data
ports:
- 9200:9200
- 9300:9300
environment:
- TZ=Aisa/Shanghai
- http.host=0.0.0.0
- transport.host=localhost
- network.host=0.0.0.0
- http.cors.allow-origin=*
- http.cors.enabled=true
- discovery.type=single-node
- 'ES_JAVA_OPTS=-Xms1024m -Xmx1024m'
graylog:
image: graylog/graylog:4.0.2
container_name: graylog
restart: always
volumes:
- /data/graylog/graylog_journal:/usr/share/graylog/data/journal
- /data/graylog/config:/usr/share/graylog/config
ports:
- 9000:9000
- 12201:12201/udp
environment:
- GRAYLOG_HTTP_EXTERNAL_URI=http://192.168.17.100:9000/
depends_on:
- mongodb
- es
links:
- mongodb:mongo
- es:elasticsearch
需要說明的是:
1、mongo的配置很簡單,就是爲了持久化,做了一個存儲的映射。
2、elasticsearch的配置,這裏做了端口映射,其實也是沒有必要的,因爲graylog訪問它是根據容器名稱來訪問的。 環境變量中discovery.type=single-node是必須的,默認就是zen的模式。最重要的一個配置就是jvm參數ES_JAVA_OPTS,這裏必須設置至少512m,否則es可能因爲啓動時內存不足,導致啓動失敗,然後容器一直處於restarting狀態,後續的graylog就連接不上,同樣也會啓動異常並報錯。
3、graylog這裏採用了本地配置映射,用到了/data/graylog/config目錄下的graylog.conf,裏面配置了很多參數,其實這些參數可以通過環境變量environment的方式添加並覆蓋,這裏想用自定義的配置文件。但是配置了http_external_uri,訪問的時候,頁面上的資源文件全部還是請求的容器ip裏面的,所以報錯,如下圖所示,後來通過environment的方式修改了這個變量,所以這裏的配置顯得很繁瑣。
4、graylog需要依賴其他兩個容器,而且訪問的時候,直接使用的容器名稱做的主機,所以links這裏配置需要注意,我們在定義mongodb、elasticsearch services名稱的時候可以隨便定義,這裏叫的是mongodb和es,但是graylog默認使用的是mongo和elasticsearch,所以我們需要在links裏面做這樣的映射:
links:
- mongodb:mongo
- es:elasticsearch
如果你的service定義的名字就是mongo和elasticsearch,就不需要映射,直接:
links:
- mongo
- elasticsearch
5、graylog採用了映射配置文件與環境變量共存的辦法,這裏配置文件是從github下載,文件名稱是graylog.conf,配置項主要是用戶登錄祕鑰和密碼sha2的加密串、時區等等。在這個配置文件裏面可以很清楚的看到,graylog連接mongo與elasticsearch所使用的url,分別是:
mongodb_uri = mongodb://mongo/graylog
elasticsearch_hosts = http://elasticsearch:9200
所以說前面,我們配置links的爲什麼要指定一個映射。
其他的配置:
password_secret = somepasswordpepper #對應環境變量就是GRAYLOG_PASSWORD_SECRET=somepasswordpepper
root_password_sha2 = 8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918 #對應環境變量就是#GRAYLOG_ROOT_PASSWORD_SHA2=8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
root_timezone = PRC #對應環境變量是 TZ=Asia/Shanghai
6、前面配置es,graylog,mongodb都做了存儲本地映射,尤其是es,mongodb,文件夾的權限必須是777,如下所示:
這個也是在實際中採坑得出的結論,容器啓動正常,但是報錯,permission denied。
7、這裏在graylog裏面不僅配置了links,還配置了depends_on,主要是graylog依賴於mongodb,es,它必須在他們兩個服務啓動之後,才能啓動,相當於做了一個約束,這個很好理解。
以上這些都做好了,就可以進行啓動docker容器了。
容器啓動,es會做初始化,graylog等待連接es,mongodb,這個過程會比較耗時,當我們看到graylog出現server up and running的時候,纔可以通過瀏覽器訪問graylog可視化webui。
2021-02-02 16:40:42,493 INFO : org.graylog2.bootstrap.ServerBootstrap - Graylog server up and running.
訪問http://192.168.17.100:9000,用戶名密碼都是admin,其中192.168.17.100是虛擬機的ip,docker安裝在虛擬機中。
登錄,進入首頁:
首頁菜單欄的位置會出現兩個警告,我們可以點開,一個是es磁盤空間問題,一個是graylog本身剛創建,還沒有設置日誌收集的輸入規則。
根據提示,我們嘗試創建日誌收集規則,在launch頁面,我們選擇gelf udp,然後點擊Launch new input按鈕。
在彈出框中,設置title就可以了。採用的是udp的方式,端口使用的是我們在docker-compose.yml中定義的12201/udp。
點擊Save保存按鈕,這個input馬上就會運行起來,警告也隨之消失,變成一個。
前面這些操作,我們只是搭建了graylog運行環境,以及設置了日誌收集輸入配置,下面就等待客戶端日誌發送到服務器了,我們可以通過java編程,也可以通過一個簡單的測試,下面通過一個簡單的模擬,定時發送消息到graylog中。這裏也會啓動一個docker,他是一個很小的容器busybox。
運行的命令:
docker run -d \
--log-driver=gelf \
--log-opt gelf-address=udp://localhost:12201 \
--log-opt tag="log-test-container-B" \
busybox sh -c 'while true; do echo "This is a log message from container B"; sleep 10; done;'
運行之後,就會不斷的發送日誌,我們在graylog的可視化界面中就可以看到日誌內容了:
graylog最新的版本是4.0.2,如果不用最新的版本鏡像,進入首頁,還有個警告是你使用了一個過時的graylog...
graylog日誌收集方式,默認提供了很多種協議,http,tcp,udp,作爲一個日誌收集系統,其實大量的日誌,並不需要保證每一條都需要保存下來,它不比數據庫系統那麼高要求,所以使用udp協議,保證收發的效率,犧牲傳輸可靠性,是一個理想的辦法。因爲丟失一條日誌,並不會影響系統的正常運行。