010*_*101 9 python logging celery
如何以编程方式打开芹菜日志?
从终端,这工作正常:
celery worker -l DEBUG
Run Code Online (Sandbox Code Playgroud)
当我打电话时get_task_logger(__name__).debug('hello'),我可以看到终端中出现的消息.(stdout和stderr正在显示)我甚import logging至可以打电话来logger.info('hi')看看.(两个都工作)
但是,在开发任务时,我更喜欢使用测试模块并直接调用任务函数而不是激活整个工作者.但我看不到日志消息.我知道Celery正在将所有内容重定向到其内部设备,但我也希望在stdout上看到日志消息.
如何告诉Celery将日志消息的副本发送回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')
Run Code Online (Sandbox Code Playgroud)
编辑 我知道我可以添加一个处理程序,通过添加一个处理程序将一些输出重定向回终端
log = get_task_logger(__name__)
h = logging.StreamHandler(sys.stdout)
log.addHandler(h)
Run Code Online (Sandbox Code Playgroud)
但这样做有"芹菜方式"吗?也许一个让我也有Celery格式的文本行.
[2014-03-02 15:51:32,949: WARNING] hello world
Run Code Online (Sandbox Code Playgroud)
I have been looking at the same issue...
What seems to work best is to use the signal handler, according to http://docs.celeryproject.org/en/latest/userguide/signals.html#after-setup-logger
In your celery.py file use:
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()
Run Code Online (Sandbox Code Playgroud)
then you can define MyLogHandler() as you wish.
To send the logs to STDOUT you should also be able to use (I have not tested it):
my_handler = logging.StreamHandler(sys.stdout)
Run Code Online (Sandbox Code Playgroud)