Docker后台运行RabbitMQ:如何实现后台启动并输出控制台日志?
解决Docker中RabbitMQ后台运行且日志输出到控制台的问题
我之前也碰到过一模一样的困扰——既要让RabbitMQ后台运行方便用rabbitmqctl做配置,又不想丢了日志输出能力,用tail -f /dev/null确实会导致日志完全看不到。这里有两种靠谱的解决方案,优先推荐第一种更贴合Docker最佳实践的方式:
方案一:让RabbitMQ直接输出日志到控制台(推荐)
RabbitMQ支持通过环境变量指定日志输出位置,我们可以让它把日志写到标准输出(stdout)和标准错误(stderr),然后直接前台运行RabbitMQ服务。这样容器会以RabbitMQ进程作为前台进程,既不会退出,日志也能被Docker正常捕获,同时还能通过docker exec执行rabbitmqctl命令做配置。
具体启动命令:
docker run -d --name my-rabbit -e RABBITMQ_LOGS=- -e RABBITMQ_SASL_LOGS=- rabbitmq:latest rabbitmq-server
RABBITMQ_LOGS=-:将RabbitMQ主日志输出到标准输出RABBITMQ_SASL_LOGS=-:将Erlang SASL架构相关的日志输出到标准输出
之后执行配置操作的示例:
# 启用RabbitMQ管理插件 docker exec -it my-rabbit rabbitmq-plugins enable rabbitmq_management # 查看队列状态 docker exec -it my-rabbit rabbitmqctl list_queues
查看日志直接用Docker自带的日志命令:
docker logs -f my-rabbit
方案二:后台启动RabbitMQ后,跟踪日志文件
如果你坚持要用rabbitmq-server -detached启动服务,那可以在启动后跟踪RabbitMQ的日志文件,让这个tail进程作为前台进程维持容器运行,同时把日志内容输出到控制台。
具体启动命令:
docker run -d --name my-rabbit rabbitmq:latest sh -c "rabbitmq-server -detached && tail -f /var/log/rabbitmq/*.log"
RabbitMQ默认日志路径是/var/log/rabbitmq/,里面包含主日志和SASL日志文件,用tail -f跟踪所有日志文件就能把内容输出到标准输出,Docker也能捕获到这些日志。
不过这种方式有个小缺点:容器的前台进程是tail而不是RabbitMQ本身,如果RabbitMQ进程意外崩溃,Docker无法直接感知到服务状态异常,所以更推荐第一种方案。
内容的提问来源于stack exchange,提问作者ed4becky
相关产品推荐
相关产品推荐

