Django中的并发进程日志

时间:2019-04-03 02:06:52

标签: python django logging multiprocessing

我正在开发一个基于Django的应用程序,该应用程序需要从多个进程写入日志文件。

我研究了this answer中的想法,其中详细介绍了multiprocessing-logging package here中使用的方法。本质上,它通过提供自定义logfile子类logging.Handler来创建一个队列,以处理对MultiProcessingHandler的输出。我在下面使用的install_mp_handler函数是该程序包的一部分,并且只是“包装”了该类中的指定记录器。

但是,我似乎找不到一种在Django中实现该方法的方式,以避免抛出此错误:

PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: /logfile.log -> /logfile.log.1

在我的MyApp/settings.py文件中,我将日志文件的处理程序配置为:

'handlers': {
        ....
        'logfile': {
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': BASE_DIR + "/logfile.log",
            'maxBytes': 50000,
            'backupCount': 2,
            'formatter': 'standard',
        },
        'console': {
            'level': 'INFO',
            'class': 'logging.StreamHandler',
            'formatter': 'standard'
        },
    },
    'loggers': {
        'django': {
            'handlers': ['console'],
            'propagate': True,
            'level': 'WARN',
        },
        'django.db.backends': {
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': False,
        },
        'MyApp': {
            'handlers': ['console', 'logfile'],
            'level': 'DEBUG',
        },

在运行多个进程的应用程序部分中,我将日志记录配置为:

# Ref: https://github.com/jruere/multiprocessing-logging
import logging
from multiprocessing_logging import install_mp_handler
LOG = logging.getLogger('MyApp')
install_mp_handler()

...

if __name__ == '__main__':

...

with Pool() as pool:
    pool.map(func, iterable)

注意:这可以很好地登录到控制台,但似乎对排队输出到日志文件没有影响。

0 个答案:

没有答案