Python, входящий в файл как словарь или JSON - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь настроить ведение журнала, в котором я могу войти как в стандартный вывод, так и в файл. Это я выполнил, используя следующий код:

logging.basicConfig(
        level=logging.DEBUG, format='%(asctime)-15s %(levelname)-8s %(message)s',
        datefmt='%a, %d %b %Y %H:%M:%S', handlers=[logging.FileHandler(path), logging.StreamHandler()])

Вывод этого примерно так:

2018-05-02 18:43:33,295 DEBUG    Starting new HTTPS connection (1): google.com
2018-05-02 18:43:33,385 DEBUG    https://google.com:443 "GET / HTTP/1.1" 301 220
2018-05-02 18:43:33,389 DEBUG    Starting new HTTPS connection (1): www.google.com
2018-05-02 18:43:33,490 DEBUG    https://www.google.com:443 "GET / HTTP/1.1" 200 None

То, что я пытаюсь сделать, это записать этот вывод в файл не так, как он печатает на стандартный вывод, а как словарь или объект JSON, похожий на что-то вроде этого (сохраняя стандартный вывод в данный момент):

[{'time': '2018-05-02 18:43:33,295', 'level': 'DEBUG', 'message': 'Starting new HTTPS connection (1): google.com'}, {...}, {...}]

Это выполнимо? Я понимаю, что могу опубликовать этот файл журнала после завершения процесса, но я ищу более элегантное решение, потому что определенные вещи, которые я регистрирую, сами по себе являются довольно большими объектами.

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

В кулинарной книге конкретно показано, как форматировать структурированное ведение журнала, здесь, в разделе, озаглавленном Реализация структурированного ведения журнала .

Другие биты (несколько обработчиков), вы уже знаете.

0 голосов
/ 03 мая 2018

Итак, основываясь на @abarnert, я нашел эту ссылку , которая обеспечила хороший путь к созданию этой концепции по большей части. Код в таком виде:

logger=logging.getLogger()
logger.setLevel(logging.DEBUG)

file_handler=logging.FileHandler('foo.log')
stream_handler=logging.StreamHandler()

stream_formatter=logging.Formatter(
    '%(asctime)-15s %(levelname)-8s %(message)s')
file_formatter=logging.Formatter(
    "{'time':'%(asctime)s', 'name': '%(name)s', \
    'level': '%(levelname)s', 'message': '%(message)s'}"
)

file_handler.setFormatter(file_formatter)
stream_handler.setFormatter(stream_formatter)

logger.addHandler(file_handler)
logger.addHandler(stream_handler)

Хотя он не полностью соответствует требованию, он не требует предварительной обработки и позволяет мне создать два обработчика журналов.

После этого я могу использовать что-то вроде:

with open('foo.log') as f:
    logs = f.read().splitlines()
for l in logs:
    for key, value in eval(l):
        do something ...

чтобы вытащить dict объекты вместо того, чтобы бороться с неправильно отформатированным JSON, чтобы выполнить то, что я намеревался выполнить.

Все еще надеюсь на более элегантное решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...