如果记录器有文件处理程序,则只创建日志目录
Only create logs' directory if logger has file handler
Python 的记录器库将创建日志文件,如果它不存在但不存在任何父目录。
无论记录器是否配置为使用 FileHandler
.
,我们的代码都会创建父目录
我们现在 运行 在 docker 中,仅使用控制台输出,并且希望避免在未安装文件处理程序的情况下创建目录。
有没有办法检测这个配置?
dictConfig()
documentation 展示了如何配置特定类型的处理程序,并且可以将其扩展到您自己的处理程序。
您可以像这样子class FileHandler
并覆盖 emit()
方法:
def emit(self, record):
dn = os.path.dirname(self.baseFilename)
if not os.path.exists(dn):
os.makedirs(dn)
super().emit(record)
然后在您的日志记录配置中使用此子class。但是,请确保使用 delay=True
实例化处理程序,如果您在自定义处理程序中覆盖 __init__()
,请从那里调用父级 class' __init__()
。 delay=True
在实际需要写入文件之前不会尝试打开文件;这是通过 FileHandler.emit()
方法完成的,通过在调用基本 class 方法之前在重写方法中创建目录' emit()
,您将仅在需要时创建目录,而不是'已经不存在了。
Python 的记录器库将创建日志文件,如果它不存在但不存在任何父目录。
无论记录器是否配置为使用 FileHandler
.
我们现在 运行 在 docker 中,仅使用控制台输出,并且希望避免在未安装文件处理程序的情况下创建目录。
有没有办法检测这个配置?
dictConfig()
documentation 展示了如何配置特定类型的处理程序,并且可以将其扩展到您自己的处理程序。
您可以像这样子class FileHandler
并覆盖 emit()
方法:
def emit(self, record):
dn = os.path.dirname(self.baseFilename)
if not os.path.exists(dn):
os.makedirs(dn)
super().emit(record)
然后在您的日志记录配置中使用此子class。但是,请确保使用 delay=True
实例化处理程序,如果您在自定义处理程序中覆盖 __init__()
,请从那里调用父级 class' __init__()
。 delay=True
在实际需要写入文件之前不会尝试打开文件;这是通过 FileHandler.emit()
方法完成的,通过在调用基本 class 方法之前在重写方法中创建目录' emit()
,您将仅在需要时创建目录,而不是'已经不存在了。