Ведение журнала Python, как отслеживать имя хоста в журналах?

Я использую ведение журнала Python следующим образом:

logger = logging.getLogger("my_logger")
logger.info("Some text.")

У меня есть куча устройств IoT, которые все работают (делают журналы). Они передают свои данные журнала в базу данных. Чтобы отличить источник, мне нужно указать исходный IP-адрес.

Есть ли способ получить имя хоста с помощью ведения журнала? Отслеживается/отслеживается ли IP-адрес или имя хоста в LogRecords?

В общем, как лучше всего добавить имя хоста в LogRecord?

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

rdas 09.04.2019 07:02
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
5
1
5 631
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете сделать это, добавив настраиваемый фильтр журнала и модуль форматирования, который помещает имя хоста в сообщения журнала.

import logging, platform

class HostnameFilter(logging.Filter):
    hostname = platform.node()

    def filter(self, record):
        record.hostname = HostnameFilter.hostname
        return True

handler = logging.StreamHandler()
handler.addFilter(HostnameFilter())
handler.setFormatter(logging.Formatter('%(asctime)s %(hostname)s: %(message)s', datefmt='%b %d %H:%M:%S'))

logger = logging.getLogger()
logger.addHandler(handler)
logger.setLevel(logging.INFO)

logger.info('Hello, world!')

Откуда мне взять hostname для форматирования?

Intrastellar Explorer 09.04.2019 04:54

Вы не знаете. Модуль ведения журнала автоматически вставит его в ваши журналы. То же самое со временем и другими полями.

rdas 09.04.2019 04:58

Ознакомьтесь с документацией по объекту записи журнала: docs.python.org/3/library/logging.html#logging.LogRecord.

rdas 09.04.2019 05:00

Посмотрите этот блог для примера help.papertrailapp.com/kb/configuration/…

rdas 09.04.2019 05:02

Вроде в блоге используют внешний модуль socket.gethostname(), а в документах LogRecord вручную печатают 192.168.0.1. В общем, мне нужно получить имя хоста из внешнего источника.

Intrastellar Explorer 09.04.2019 07:01

Похоже, @gobernador несколько месяцев спустя отредактировал вопрос и обновил его, включив в него фактическое имя хоста.

Intrastellar Explorer 10.11.2020 01:53

Более простым решением было бы предварительно заполнить строку формата именем хоста. Например:

logging.basicConfig(
   #... your logging configuration,
   format = "%(asctime)s {} %(message)s".format(socket.gethostname())
)

будет генерировать строку формата, например

"%(asctime)s some-hostname %(message)s"

Недостатком является то, что если имя хоста изменится, вам нужно будет перезапустить службу/приложение. Обычно это не проблема для большинства приложений, особенно если они работают на docker/k8s.

Другие вопросы по теме