1. 程式人生 > 其它 >.Net RabbitMQ實戰指南——服務日誌

.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資料。