我似乎无法使用Windows目录分隔符将带有路径的日志文件名称传递到Windows平台上的记录器。记录器配置:
[handler_fileHandler]
class=FileHandler
formatter=fileFormatter
args=('%(logfilename)s',)
这有效:
logging.config.fileConfig(logger_config_file, defaults={'logfilename': 'test.txt})
这有效:
logging.config.fileConfig(logger_config_file, defaults={'logfilename': 'E:/dddd/rrrr/nnnn/tttt/test.txt'})
如果我尝试:
logging.config.fileConfig(logger_config_file, defaults={'logfilename': 'E:\\dddd\\rrrr\\nnnn\\tttt\\test.txt'})
我收到此异常:
File "C:\Program Files\Python36\lib\logging\config.py", line 84, in fileConfig
handlers = _install_handlers(cp, formatters)
File "C:\Program Files\Python36\lib\logging\config.py", line 148, in _install_handlers
h = klass(*args)
File "C:\Program Files\Python36\lib\logging\__init__.py", line 1030, in __init__
StreamHandler.__init__(self, self._open())
File "C:\Program Files\Python36\lib\logging\__init__.py", line 1059, in _open
return open(self.baseFilename, self.mode, encoding=self.encoding)
OSError: [Errno 22] Invalid argument: 'E:\\dddd\rrrr\nnnn\tttt\test.txt'
我想使用os.path.join构建此路径。那将使用“ \\” Windows目录分隔符。该代码应该在Windows和Linux系统上运行。
我应该将linux样式分隔符放入fileConfig中,还是一个bug?重新格式化为Linux样式分隔符的简单解决方案看起来像什么? 谢谢
编辑:
如果我这样构建路径,则os.path.join()将添加Windows分隔符:
logging_path = os.path.join('E:/dddd/tttt', 'rrrr')
logging_file = os.path.join(logging_path, 'test.txt')
结果为:“ E:/ dddd / tttt \\ rrrr \\ test.txt”
这是一条可行的路径,因为这可行:
open(logging_file)
这仍然会失败:
logging.config.fileConfig(logger_config_file, defaults={'logfilename': logging_file})
我找到了解决方案。这有效:
logging.config.fileConfig(logger_config_file, defaults={'logfilename': logging_file.replace('\\', '/'})
我不确定我是否应该不将Windows分隔符放入fileConfig或fileConfig是否可以更好地处理。无论如何,我希望这会有所帮助。