我正在开发一个基于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)
注意:这可以很好地登录到控制台,但似乎对排队输出到日志文件没有影响。