【问题标题】:Logging: How to set the newline character of log files?日志记录:如何设置日志文件的换行符?
【发布时间】:2021-11-06 18:45:22
【问题描述】:

我在 WindowsLinux 上都使用 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

也许有一种方法可以确保在 WindowsLinux 上登录时使用相同的行结尾,但我还没有找到。

问候。

【问题讨论】:

    标签: python logging newline eol os-agnostic


    【解决方案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 中使用
    • 确实做到了,而且有效,只是为了覆盖一个隐藏的参数而这样做有点奇怪。
    猜你喜欢
    • 2012-02-02
    • 2023-03-23
    • 2021-11-01
    • 2012-09-24
    • 2013-01-02
    • 1970-01-01
    • 2012-09-03
    • 1970-01-01
    • 2010-09-13
    相关资源
    最近更新 更多