Python日志记录:如何在日志配置文件中表示格式字符串中的换行符?

时间:2012-01-04 23:44:41

标签: python logging

我正在从文件配置我的Python日志记录(请参阅http://www.python.org/doc//current/library/logging.html#configuration-file-format)。

从该页面上的示例中,我在配置文件中有一个格式化程序,如下所示:

[formatter_form01]
format=F1 %(asctime)s %(levelname)s %(message)s
datefmt=
class=logging.Formatter

如何在"格式"中添加换行符?指定格式化程序的字符串? \n\\n都不起作用(例如format=F1\n%(asctime)s %(levelname)s %(message)s不起作用)。感谢

6 个答案:

答案 0 :(得分:8)

logging.config模块使用ConfigParser读取配置文件,该文件支持多行值。

因此,您可以像这样指定format字符串:

[formatter_form01]
format=F1
    %(asctime)s %(levelname)s %(message)s
datefmt=
class=logging.Formatter

通过缩进以下行来继续多行值(一个或多个空格或制表符计为缩进)。

答案 1 :(得分:6)

日志记录配置文件基于ConfigParser模块。在那里你会发现你可以这样解决它:

[formatter_form01]
format=F1
   %(asctime)s %(levelname)s %(message)s
datefmt=
class=logging.Formatter

答案 2 :(得分:0)

我最好的选择是使用自定义格式化程序(而不是logging.Formatter)...作为参考,这里是logging.Formatter.format的源代码:

def format(self, record):
    record.message = record.getMessage()
    if string.find(self._fmt,"%(asctime)") >= 0:
        record.asctime = self.formatTime(record, self.datefmt)
    s = self._fmt % record.__dict__
    if record.exc_info:
        # Cache the traceback text to avoid converting it multiple times
        # (it's constant anyway)
        if not record.exc_text:
            record.exc_text = self.formatException(record.exc_info)
    if record.exc_text:
        if s[-1:] != "\n":
            s = s + "\n"
        s = s + record.exc_text
    return s

我很清楚,如果从文本文件(单行)中读取self._fmt,则不可能进行任何类型的转发。也许你可以从logging.Formatter扩展,覆盖这个方法并用第4行代替:

s = self._fmt.replace('\\n', '\n') % record.__dict__

或更通用的内容,如果您希望其他内容也被转义。

编辑:或者,您可以在 init 方法中执行此操作一次(而不是每次格式化邮件时)。但正如其他人已经指出的那样,ConfigParser支持多行,所以不需要走这条路......

答案 3 :(得分:0)

这可能是一种简单的方法:

import logging
logformat = """%(asctime)s ... here you get a new line
    ... %(thread)d .... here you get another new line
    %(message)s"""
logging.basicConfig(format=logformat, level=logging.DEBUG)

我测试过,上面的设置为每条日志消息提供了两条新行,如代码中所示。注意:%(asctime)s和类似的东西是python日志格式化字符串。

答案 4 :(得分:0)

import logging
logformat = "%(asctime)s %(message)s\n\r"
logging.basicConfig(level=logging.DEBUG, format=logformat,filename='debug.log', filemode='w')           
logging.debug (Your String here)

文件中的调试文本将用新行写入。

答案 5 :(得分:0)

只需在basicConfig函数的右撇号前添加“ \ n”

logging.basicConfig(level=logging.DEBUG, format=' %(levelname)s - %(message)s\n')

log message with newline after the message