【问题标题】:Python-Celery LogPython-Celery 日志
【发布时间】:2018-02-26 13:12:16
【问题描述】:

我使用烧瓶、python 3.x 和 celery4 (总共 8 个工人)

如果文件大小超过,我想用 'RotatingFileHandler' 制作日志文件。

它在第一个日志文件中运行良好。 (包括所有worker日志,PoolWorker-1 ~ PoolWorker-8)

-rw-rw-r-- 1 sj sj   1048530  9월 18 10:01 celery_20170918.log (All worker's log)

但是当文件大小结束时,工作人员会在单独的文件上写入日志。

-rw-rw-r-- 1 sj sj    223125  9월 18 10:47 celery_20170918.log  (All worker's log except below 2, 5, 6))
-rw-rw-r-- 1 sj sj     43785  9월 18 10:47 celery_20170918.log.1 (only PoolWorker-2 log)
-rw-rw-r-- 1 sj sj     46095  9월 18 10:47 celery_20170918.log.2 (only PoolWorker-5 log)
-rw-rw-r-- 1 sj sj     45990  9월 18 10:47 celery_20170918.log.3 (only PoolWorker-6 log)
-rw-rw-r-- 1 sj sj   1048530  9월 18 10:01 celery_20170918.log.4 (Log file made at first is changed to this.)

我不知道规则是什么,他们有任何重复的日志..!!!

我的芹菜记录器如下。

tasks.py

logger = get_task_logger('tasks')
logger.setLevel("INFO")
filename = './log/celery/celery_task.log'
formatter = Formatter('%(levelname)s-%(asctime)s %(processName)s %(funcName)s():%(lineno)d %(message)s')
# FileSize rotating
fileMaxByte = 1024 * 1024 * 1  # 30MB
fileHandler = logging.handlers.RotatingFileHandler(filename, maxBytes=fileMaxByte, backupCount=100)
fileHandler.setFormatter(formatter)
logger.addHandler(fileHandler)

@celery.task(...options...)
def test_call(self):
    logger.info("LOG TEST")

test.py

if __name__ == '__main__':
    test_call.apply_async()

怎么了?

【问题讨论】:

    标签: python-3.x logging celery celery-task


    【解决方案1】:

    RotatingFileHandler 在进行日志文件翻转时不要保持多进程之间的原子性。

    在多进程环境中,进程A看到maxBytes到达日志文件c.log,将文件重命名为c.log.1,然后将一些日志行写入新创建的c.log

    但同时,另一个进程B可能还持有c.log的句柄,因为the way used to check file size是基于文件句柄的结束偏移量,它也看到maxBytes到达,想做文件滚动自行结束,因为the way used to roll over是重命名磁盘上的文件,这个过程尝试将c.log重命名为c.log.1,但由于c.log.1存在,重命名为c.log.2

    由于还有其他进程,c.log.3 被创建以此类推。

    使用外部日志记录机制可以很好地解决此问题,或者您可以封装自己的原子文件轮换日志记录处理程序。

    【讨论】:

    • 非常感谢!很好的答案:) 我会尝试制作自己的旋转记录器。谢谢!
    • external logging mechanism 的一些示例将是对这个答案的一个很好的补充。
    • @KBoehme 它在很大程度上取决于上下文,通常,您可以使用 (r)syslogd/systemd。
    猜你喜欢
    • 2021-03-29
    • 1970-01-01
    • 2015-10-11
    • 2013-09-30
    • 1970-01-01
    • 2011-10-19
    • 2015-06-04
    • 2021-07-03
    • 1970-01-01
    相关资源
    最近更新 更多