日志记录:如何设置日志文件的换行符?
Posted
技术标签:
【中文标题】日志记录:如何设置日志文件的换行符?【英文标题】:Logging: How to set the newline character of log files? 【发布时间】:2021-11-06 18:45:22 【问题描述】:我在 Windows 和 Linux 上都使用 Python 3.7+ 登录,但行尾取决于平台。
虽然您可以在读取或写入文件时设置换行符,但显然您不能在设置 logging.FileHandler
时设置:
https://docs.python.org/3/library/logging.handlers.html#filehandler
像logging.FileHandler(newline = '\n')
这样的东西就可以了,就像io.open(newline = '\n')
一样:
https://docs.python.org/3/library/io.html?highlight=file#io.open(读取或写入文件)https://docs.python.org/3/library/io.html?highlight=file#io.TextIOWrapper(此处解释newline
)
也许有一种方法可以确保在 Windows 和 Linux 上登录时使用相同的行结尾,但我还没有找到。
问候。
【问题讨论】:
【参考方案1】:logging.FileHandler
继承自具有 terminator
属性的 logging.StreamHandler
。您可以在实例上设置它。我提供了一个使用os
模块的可移植解决方案,但如果需要,您可以明确设置它。
import logging
h = logging.FileHandler("foo.log")
h.terminator = "\n"
编辑:修复了始终使用\n
作为行终止符的解决方案。
https://docs.python.org/3/library/logging.handlers.html#logging.StreamHandler.terminator
【讨论】:
好的,我已经尝试过h.terminator = '\n'
,但在Windows上,行尾仍然是\r\n
。
@Kochise:\r\n
是 Windows 文本文件的正确行终止符。它可能不会在 Lunix 上这样做。【参考方案2】:
不幸的是,您无法控制它,因为 FileHandler 在后台使用的open()
将换行符替换为操作系统默认值。如果您真的想要对其进行特定控制,要创建不同于当前操作系统默认值的换行符,您必须继承 FileHandler:
import logging
class MyFileHandler(logging.FileHandler):
def _open(self):
return open(self.baseFilename, self.mode, encoding=self.encoding, newline='\n') # set newline according to your needs here
h = MyFileHandler("foo.log")
编辑:删除了 3.7 中不存在的 errors
【讨论】:
嗨,似乎是一个很好的解决方案,但我得到了:AttributeError: 'MyFileHandler' object has no attribute 'errors'
@Kochise 错误是 python 3.9 中的新内容,我删除了它,因此代码可以在 3.7 中使用
确实做到了,而且有效,只是为了覆盖一个隐藏的参数而这样做有点奇怪。
docs.python.org/3.7/library/…以上是关于日志记录:如何设置日志文件的换行符?的主要内容,如果未能解决你的问题,请参考以下文章
lamp-日志设置(访问日志切割不记录静态文件日志缓存文件过期时间)