Ведение журнала на 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)
Отладочный текст в файле будет записан с новой строкой.