简体   繁体   English

如何在 supervisord 中捕获 Flask CLI 命令的 output 并将其重定向到标准输出?

[英]How to capture output of Flask CLI command in supervisord and redirect it to stdout?

This is my Flask CLI script.这是我的 Flask CLI 脚本。 It awaits for messages from rabbitmq and prints them out.它等待来自rabbitmq的消息并将它们打印出来。

import pika
import click
from app import app_queue
from app import RABBITMQ_USER
from app import RABBITMQ_HOST
from app import RABBITMQ_PASSWORD
from app import RABBITMQ_PASSWORD
from app import RABBITMQ_PORT
from app import RABBITMQ_VHOST
from flask import current_app
from flask.cli import with_appcontext
from threading import Event

credentials = pika.PlainCredentials(RABBITMQ_USER, RABBITMQ_PASSWORD)
parameters = pika.ConnectionParameters(RABBITMQ_HOST, RABBITMQ_PORT, RABBITMQ_VHOST, credentials)
connection = pika.BlockingConnection(parameters)
channel = connection.channel()


@app_queue.command("listen", help="Listen to default queue.")
@click.argument("queue", required=False)
@with_appcontext
def consume_message(queue):
    queue = queue if queue else 'results'
    print(f'Command is listening for "{queue}" queue.', flush=True)

    channel.queue_declare(queue, durable=True, exclusive=False)
    channel.basic_consume(queue=queue, on_message_callback=process_results)

    print(f'[*] Waiting for messages. from "{queue}" queue. To exit press CTRL+C', flush=True)
    channel.start_consuming()

    Event().wait()


def process_results(ch, method, properties, body):
    print(" [x] Received %r" % body, flush=True)
    ch.basic_ack(delivery_tag = method.delivery_tag)

The script is executed by supervisord which triggers flask queue listen command.该脚本由supervisord执行,触发flask queue listen命令。

[program:app_rabbitmq]
user=root
numprocs=1
directory=/src
autostart=true
autorestart=true
process_name=%(program_name)s
redirect_stderr=true
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
command=flask queue listen

How can I redirect output of Flask CLI command to stdout so I can see it with docker logs <my_container> command?如何将 Flask CLI 命令的 output 重定向到标准输出,以便我可以使用docker logs <my_container>命令看到它?

I found solution.我找到了解决方案。 Here are three things that I did.这是我做的三件事。

  • Instead redirecting my log to /dev/stdout I redirected it to /proc/1/fd/1而是将我的日志重定向到/dev/stdout我将它重定向到/proc/1/fd/1

  • I started supervisord in nodaemon mode supervisord -n我在 nodaemon 模式下启动supervisord supervisord -n

  • I set these two environment variables in my docker image export PYTHONUNBUFFERED=True and export PYTHONIOENCODING=UTF-8我在我的 docker 图像中设置了这两个环境变量export PYTHONUNBUFFERED=Trueexport PYTHONIOENCODING=UTF-8

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM