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數據。

