Вопрос:

Может ли структурированное ведение журнала выполняться с помощью стандартной библиотеки Pythons?

python logging structured-logging

604 просмотра

2 ответа

48700 Репутация автора

Я недавно читал о структурированной регистрации ( здесь ). Идея состоит в том, чтобы вести журнал не путем добавления простых строк в виде строки в файл журнала, а вместо этого в виде объектов JSON. Это позволяет анализировать файл журнала автоматическими инструментами.

Может ли loggingбиблиотека Pythons вести структурированное ведение журнала? Если нет, то существует ли для него «основное» решение (например, как numpy / scipy является основным решением для научных расчетов)? Я нашел structlog, но я не уверен, насколько это широко распространено.

Автор: Martin Thoma Источник Размещён: 09.01.2018 02:46

Ответы (2)


4 плюса

5962 Репутация автора

Вы смотрели на раздел сайта документации Python, описывающий реализацию структурированного ведения журнала, который объясняет, как pythonвстроенный регистратор может использоваться для структурированного ведения журнала?

Ниже приведен простой пример, приведенный на сайте выше.

import json
import logging

class StructuredMessage(object):
    def __init__(self, message, **kwargs):
        self.message = message
        self.kwargs = kwargs

    def __str__(self):
        return '%s >>> %s' % (self.message, json.dumps(self.kwargs))

m = StructuredMessage   # optional, to improve readability

logging.basicConfig(level=logging.INFO, format='%(message)s')
logging.info(m('message 1', foo='bar', bar='baz', num=123, fnum=123.456))

Что приводит к следующему журналу.

message 1 >>> {"fnum": 123.456, "num": 123, "bar": "baz", "foo": "bar"}

Надеюсь это поможет.

Автор: Anil_M Размещён: 09.01.2018 02:59

1 плюс

48700 Репутация автора

Решение

Если вы установили python-json-logger(288 звезд, 70 вилок) и настроили конфигурацию ведения журнала (YAML), как показано ниже, вы получите структурированный файл ведения журнала.

version: 1
formatters:
    detailed:
        class: logging.Formatter
        format: '[%(asctime)s]:[%(levelname)s]: %(message)s'
    json:
        class: pythonjsonlogger.jsonlogger.JsonFormatter
        format: '%(asctime)s %(levelname)s %(message)s'
handlers:
    console:
        class: logging.StreamHandler
        level: INFO
        formatter: detailed
    file:
        class: logging.FileHandler
        filename: logfile.log
        level: DEBUG
        formatter: json
root:
    level: DEBUG
    handlers:
        - console
        - file

Исключения

Вы также можете сделать исключения / трассировки использовать структурированный формат.

См. Могу ли я сделать исключения вывода Python в одну строку / через логирование?

Автор: Martin Thoma Размещён: 11.01.2018 08:17
Вопросы из категории :
32x32