.Net RabbitMQ實戰指南——服務日誌
RabbitMQ的日出輸入方式有很多種:file、console 、syslog 、exchange。
在RabbitMQ中,日誌級別有none(0)、critical(4)、error(8)、warning(16)、info(64)、debug(128)這5種,如果訊息的級別高於日誌的級別則不會被髮送,比如warning級別的日誌包含warning和error級別的日誌,none表示不輸出日誌。
日誌檔案
RabbitMQ的日誌檔案預設存放在/var/log/rabbitmq資料夾內。
通過cat命令檢視日誌檔案內容
amq.rabbitmq.log
RabbitMQ預設會建立一些交換器,如amq.rabbitmq.log(topic型別)用來收集RabbitMQ日誌,所有的服務日誌都會發往這個交換器中。
在我安裝的3.8.2版本中並沒有預設建立log這個交換器,查詢官方文件在https://www.rabbitmq.com/event-exchange.html有提到,我們通過命令開啟外掛:
rabbitmq-plugins enable rabbitmq_event_exchange 。
開啟外掛會建立一個類似amq.rabbitmq.log交換器的amq.rabbitmq.event交換器,通過amq.rabbitmq.event交換器可以像應用程式公開交換器、佇列等建立和刪除事件。由此猜想出amq.rabbitmq.log還是支援的只不過需要我們通過一些設定開啟。https://www.rabbitmq.com/logging.html文件中有提到log的一些設定,但是卻沒有log.exchange相關的介紹,但是在rabbitmq.conf檔案中發現有log.exchange對應的配置。
通過當前節點的詳情檢視,Config file 對應的部分為空
說明缺少配置檔案不存在(/etc/rabbitmq/rabbitmq.conf),需要手動建立rabbitmq.config。檔案內容複製:https://github.com/rabbitmq/rabbitmq-server/blob/v3.8.x/deps/rabbit/docs/rabbitmq.conf.example
取消註釋,重啟rabbitmq(service rabbitmq-server restart)
通過web管理外掛看到amq.rabbitmq.log交換器已經成功顯示
建立3個日誌佇列queue.info、queue.warning和queue.error,分別用info、warning和error這3個路由鍵來繫結amq.rabbitmq.log。如果要使用一個佇列來收集所有級別的日誌,可以使用“#”這個路由鍵。
對RabbitMQ進行一系列操作,看到佇列中已經接收到日誌資料
程式碼消費info訊息:
#region 日誌 using (var channel = connection.CreateModel()) { var consumer = new RabbitMQConsumer(channel); consumer.Received += (ch, ea) => { var body = ea.Body.ToArray(); Console.WriteLine($"Received:{Encoding.UTF8.GetString(body)}"); channel.BasicAck(ea.DeliveryTag, false); }; var consumerTag = channel.BasicConsume("queue.info", false,"Info", consumer); Console.WriteLine(consumerTag); Console.ReadKey(); } #endregion
執行效果:
EFK(Elasticsearch+Filebeat+Kibana)收集日誌
安裝
通過Docker安裝Elasticsearch+Filebeat+Kibana,拉取慢的可以通過配置國內的映象加速器
docker pull elasticsearch:7.13.2
docker pull store/elastic/filebeat:7.13.2
docker pull kibana:7.13.2
啟動
執行如下命令啟動es,以單節點的方式啟動,指定堆記憶體為512m
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e ES_JAVA_POTS="-Xms512m -Xmx512m" -e "discovery.type=single-node" elasticsearch:7.13.2
瀏覽器開啟網址http://localhost:9200/,瀏覽器返回如下內容說明安裝並啟動成功
啟動kibana,--link 選項,將es和kibana兩個容器關聯共享一個網路。
docker run -d --link elasticsearch -p 5601:5601 --name kibana kibana:7.13.2
瀏覽器開啟網址http://localhost:5601/,成功開啟說明安裝並啟動成功。
啟動filebeat。
docker run -d --link elasticsearch --link kibana --name filebeat a0f498c7aa02 setup -E setup.kibana.host=http://localhost:5601 \ -E output.elasticsearch.hosts=["localhost:9200"]
docker啟動kibana和filebeat是通過--link 指定容器之間網路互聯,已經不推薦,應該使用 network。
建立專用網路:
docker network create logging
啟動命令加上網路配置:
--net logging
配置
通過如下命令root使用者進入docker
docker exec -it --user root filebeat /bin/bash
修改filebeat.yml檔案:
並通過如下命令開啟rabbitmq 相關模組
./filebeat modules enable rabbitmq
修改modules.d/rabbitmq.yml 檔案,取消var.paths的註釋,修改路徑為rabbitmq的日誌路徑。
docker客戶端進入cli會因為許可權問題無法修改filebeat.yml(只讀)檔案,所以改名命令方式進入docker的cli下修改檔案
在kibana檢視已經有filebeat對應索引生成。
正常情況下應該會有rabbitmq的日誌資料。因為我RabbitMQ安裝在WSL中,filebeat安裝在本機Docker,不能正確設定var.paths的值,所以沒有log資料。