Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何通过编程告诉芹菜将所有日志消息发送到stdout或stderr?_Python_Logging_Celery - Fatal编程技术网

Python 如何通过编程告诉芹菜将所有日志消息发送到stdout或stderr?

Python 如何通过编程告诉芹菜将所有日志消息发送到stdout或stderr?,python,logging,celery,Python,Logging,Celery,如何以编程方式打开芹菜日志记录? 从终端上看,这可以很好地工作: celery worker -l DEBUG 当我调用get\u task\u logger(\uuu name\uuuu).debug('hello')时,我可以看到终端中出现了消息。(正在显示stdout和stderr)我甚至可以导入日志并调用logger.info('hi'),也可以看到这一点。(两种方法都有效) 然而,在开发任务时,我更喜欢使用测试模块并直接调用任务函数,而不是启动整个工作程序。但是我看不到日志消息。我知

如何以编程方式打开芹菜日志记录?

从终端上看,这可以很好地工作:

celery worker -l DEBUG
当我调用
get\u task\u logger(\uuu name\uuuu).debug('hello')
时,我可以看到终端中出现了消息。(正在显示stdout和stderr)我甚至可以
导入日志
并调用
logger.info('hi')
,也可以看到这一点。(两种方法都有效)

然而,在开发任务时,我更喜欢使用测试模块并直接调用任务函数,而不是启动整个工作程序。但是我看不到日志消息。我知道芹菜正在将所有内容重定向到它的内部设备,但我也想看到标准输出上的日志消息

如何告诉芹菜将日志消息的副本发送回stdout?

我在网上读了很多关于日志记录的文章,但似乎芹菜中的一些日志记录相关配置变量已经被弃用,从文档中我不清楚今天支持的路径是什么

下面是一个示例模块,它创建芹菜对象并尝试记录输出。终端中没有显示任何内容。

示例mymodule.py

from celery import Celery
import logging
from celery.utils.log import get_task_logger

app = Celery('test')
app.config_from_object('myfile', True)

get_task_logger(__name__).warn('hello world')
logging.getLogger(__name__).warn('hello world 2')
编辑 我知道我可以添加处理程序,通过添加处理程序将一些输出重定向回终端

log = get_task_logger(__name__)
h = logging.StreamHandler(sys.stdout)
log.addHandler(h)
但有没有“芹菜法”可以做到这一点?也许是一个让我也有芹菜格式的文本行

[2014-03-02 15:51:32,949: WARNING] hello world

我一直在看同一个问题

最有效的方法似乎是使用信号处理器,根据

芹菜.py
文件中使用:

from celery.signals import after_setup_logger
import logging


@after_setup_logger.connect()
def logger_setup_handler(logger, **kwargs ):
  my_handler = MyLogHandler()
  my_handler.setLevel(logging.DEBUG) 
  my_formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') #custom formatter
  my_handler.setFormatter(my_formatter)
  logger.addHandler(my_handler)

  logging.info("My log handler connected -> Global Logging")


if __name__ == '__main__':
  app.start()
然后,您可以根据需要定义
MyLogHandler()

要将日志发送到STDOUT,您还应该能够使用(我没有测试它):

my_handler = logging.StreamHandler(sys.stdout)