如何从celery pprint输出中删除时间戳?

时间:2015-11-05 15:09:05

标签: python celery pprint

当运行芹菜工作者时,pprint的每一行输出总是以时间戳为前缀,并且也被剥离。这使得它非常难以理解:

[2015-11-05 16:01:12,122: WARNING/Worker-2] {
[2015-11-05 16:01:12,122: WARNING/Worker-2] u'key1'
[2015-11-05 16:01:12,122: WARNING/Worker-2] :
[2015-11-05 16:01:12,122: WARNING/Worker-2] 'value1'
[2015-11-05 16:01:12,122: WARNING/Worker-2] ,
u'_id':
[2015-11-05 16:01:12,122: WARNING/Worker-2] ObjectId('55fff3b74322c53d18ae4687')
...

有没有办法告诉芹菜不要格式化pprint的输出?

更新:

这个问题有点不对劲。所需的输出看起来像这样:

[2015-11-05 16:01:12,122: WARNING/Worker-2] 
{
    u'key1': 'value1',
    u'_id': ObjectId('55fff3b74322c53d18ae4687'),
    ...

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

正如@xbirkettx所述,输出格式在CELERYD_LOG_FORMAT设置中定义,默认为[%(asctime)s: %(levelname)s/%(processName)s] %(message)s

所以,在你的设置中:

CELERYD_LOG_FORMAT = '[%(levelname)s/%(processName)s] %(message)s'

任务记录器还有一个特殊设置,默认为:

CELERYD_TASK_LOG_FORMAT = [%(asctime)s: %(levelname)s/%(processName)s]
[%(task_name)s(%(task_id)s)] %(message)s

删除asctime键以删除时间戳。 CELERYD_TASK_LOG_FORMAT上的文档。

更新

来自docs

  

您也可以使用print()作为标准输出/ -err的任何内容   将被重定向到日志记录系统(您可以禁用此功能,请参阅   CELERY_REDIRECT_STDOUTS)。

因此,不是调用pprint.pprint,而是使用pprint.pformat格式化字符串然后记录它。

@periodic_task(run_every=timedelta(seconds=10))
def pprint_dict2():
    import pprint
    values = {
        u'key1': 'value1',
        u'_id1': "ObjectId('55fff3b74322c53d18ae4687')",
        u'key2': 'value2',
        u'_id2': "ObjectId('55fff3b74322c53d18ae4687')",
        u'key3': 'value3',
        u'_id3': "ObjectId('55fff3b74322c53d18ae4687')",
        u'key4': 'value4',
        u'_id3': "ObjectId('55fff3b74322c53d18ae4687')",
    }
    s = pprint.pformat(values, width=1)
    print(s)  # or even better logger.info(...)

输出:

[WARNING/Beat] {u'_id1': "ObjectId('55fff3b74322c53d18ae4687')",
 u'_id2': "ObjectId('55fff3b74322c53d18ae4687')",
 u'_id3': "ObjectId('55fff3b74322c53d18ae4687')",
 u'key1': 'value1',
 u'key2': 'value2',
 u'key3': 'value3',
 u'key4': 'value4'}