.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数据。