日志记录:如何设置日志文件的换行符?

Posted

技术标签:

【中文标题】日志记录:如何设置日志文件的换行符?【英文标题】: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 上登录时使用相同的行结尾,但我还没有找到。

问候。

【问题讨论】:

【参考方案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-日志设置(访问日志切割不记录静态文件日志缓存文件过期时间)

乌班图系统如何生成日志

nginx访问日志配置+日志切割+不记录静态文件日志+设置静态文件过期时间

nginx 如何配置日志不记录静态文件的访问

Spring Boot:如何使用 application.properties 设置日志记录级别?