python3 多logger写入同一个文件,RotatingFileHandler滚动覆盖报错 PermissionError?

def get_logger(name):
    logger = logging.getLogger(name)
    # 创建一个handler,用于写入日志文件
    # 所有logger的文件名都一样,即存入同一个文件中
    filename = Path("logs").joinpath(f'{datetime.now().date()}.log')
    fh = RotatingFileHandler(filename, mode='w+', encoding='utf-8', maxBytes=1024*30, backupCount=30)
    # 再创建一个handler用于输出到控制台
    ch = logging.StreamHandler()
    # 定义输出格式(可以定义多个输出格式例formatter1,formatter2)
    formatter = logging.Formatter('%(asctime)s %(name)s %(levelname)s %(message)s')
    # 定义日志输出层级
    logger.setLevel(logging.DEBUG)
    # 定义控制台输出层级
    # logger.setLevel(logging.DEBUG)
    # 为文件操作符绑定格式(可以绑定多种格式例fh.setFormatter(formatter2))
    fh.setFormatter(formatter)
    # 为控制台操作符绑定格式(可以绑定多种格式例ch.setFormatter(formatter2))
    ch.setFormatter(formatter)
    # 给logger对象绑定文件操作符
    logger.addHandler(fh)
    # 给logger对象绑定文件操作符
    logger.addHandler(ch)
    return logger

if __name__ == "__main__":
  log1 = get_logger("log1")
  log2 = get_logger("log2")

  while True:
      log1.info("x" * 1024)
      sleep(0.5)
      log2.info("y" * 1024)
      sleep(0.5)

# 发生异常 PermissionError: [WinError 32] 另一个程序正在使用此文件,进程无法访问。

这个问题的原因是多个logger不能操作一个文件吗?
如果是的话应该如果处理这个问题?

阅读 1.8k
1 个回答

mac下面我测试是没有问题的。这个应该是windows下面的问题?

不过这应该是多进程原因导致,一个进程打开该文件进行写操作,此时还没有关闭(释放)文件。此时另外一个进程也想写入操作,然后就报PermissionError

感觉跟多logger写统一日志文件也没有啥关系。重点应该在排查还有是否有多进程?还有哪些进程会同时对该文件有写操作?


本文参与了SegmentFault 思否面试闯关挑战赛,欢迎正在阅读的你也加入。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题