为什么python logging RotatingFileHandler在多个进程中使用时会丢失记录?

为什么python logging RotatingFileHandler在多个进程中使用时会丢失记录?,python,logging,multiprocessing,Python,Logging,Multiprocessing,最近我意识到我的应用程序生成的日志记录比我预期的要少。经过一些实验,我发现问题在于旋转文件处理程序和多处理 import logging from logging import handlers from multiprocessing import Pool import os log_file_name = 'log.txt' def make_logger(): logger = logging.getLogger('my_logger') logger.setLeve

最近我意识到我的应用程序生成的日志记录比我预期的要少。经过一些实验,我发现问题在于旋转文件处理程序和多处理

import logging
from logging import handlers
from multiprocessing import Pool
import os


log_file_name = 'log.txt'
def make_logger():
    logger = logging.getLogger('my_logger')
    logger.setLevel(logging.INFO)

    current_handler_names = {handler.name for handler in logger.handlers}
    handler_name = 'my_handler'
    if handler_name in current_handler_names:
        return logger

    handler = handlers.RotatingFileHandler(
        log_file_name, maxBytes=10 * 2 ** 10, backupCount=0)
    handler.setLevel(logging.INFO)
    handler.set_name(handler_name)

    logger.addHandler(handler)

    return logger



def f(x):
    logger = make_logger()
    logger.info('hey %s' % x)


if os.path.exists(log_file_name):
    os.unlink(log_file_name)

p = Pool(processes=30)
N = 1000
p.map(f, range(N))
with open(log_file_name, 'r') as f:
    print 'expected: %s, real: %s' % (N, f.read().count('hey'))
输出:

$ python main.py
expected: 1000, real: 943
我做错了什么?

事实上

虽然日志记录是线程安全的,并且支持从单个进程中的多个线程记录到单个文件,但不支持从多个进程记录到单个文件

简而言之,
RotatingFileHandler
只需从一个进程中关闭并删除文件,然后打开一个新文件。但是其他进程不知道新的文件描述符,并且看到以前的文件描述符已经关闭。只有先旋转文件的进程才能继续日志记录


为了解决类似的问题,我建议使用
logrotate
守护进程来旋转这些进程之外的文件。它不会关闭文件描述符,只是截断文件。因此,文件保持不变,其他进程可以继续记录。

感谢您的链接!但您的解释对我来说似乎是错误的,因为在我的计算机上,代码段显示了不同的结果,具有非常小的N和较大的maxBytes值,因此在代码段执行期间没有滚动