Ведение журнала на Python: как представить символы новой строки в строке формата в файле конфигурации журнала?

Я настраиваю ведение журнала 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

Как поместить строку новой строки в строку "format", которая указывает форматтер? Ни работа \n, ни \\n (например, format=F1\n%(asctime)s %(levelname)s %(message)s не работает). Благодаря

Ответ 1

Модуль logging.config читает конфигурационные файлы с ConfigParser, который поддерживает многострочные значения.

Итак, вы можете указать строку format следующим образом:

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

Многострочные значения продолжаются отступом следующих строк (одно или несколько пробелов или вкладок считаются отступом).

Ответ 2

Файл конфигурации ведения журнала основан на модуле ConfigParser. Там вы обнаружите, что можете решить это следующим образом:

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

Ответ 3

Моя лучшая ставка будет заключаться в использовании пользовательского форматирования (вместо 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 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__

или что-то более общее, если вы хотите, чтобы другие вещи также были экранированы.

EDIT: альтернативно, вы можете сделать это в методе init, один раз (а не каждый раз, когда сообщение отформатировано). Но, как уже указывали другие, ConfigParser поддерживает несколько строк, поэтому нет необходимости идти по этому маршруту...

Ответ 4

Это может быть простой способ:

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.

Ответ 5

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)

Отладочный текст в файле будет записан с новой строкой.