gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 00:22:29 29 4
gpt4 key购买 nike

最近我发现我的应用程序生成的日志记录比我预期的要少。经过一些实验,我发现问题出在 RotatingFileHandler 和多处理中。

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

我做错了什么?

最佳答案

原样well explained ,

Although logging is thread-safe, and logging to a single file from multiple threads in a single process is supported, logging to a single file from multiple processes is not supported

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

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

关于python - 为什么python日志记录RotatingFileHandler在多个进程中使用时会丢失记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48660849/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com