Я использую ведение журнала Python следующим образом:
logger = logging.getLogger("my_logger")
logger.info("Some text.")
У меня есть куча устройств IoT, которые все работают (делают журналы). Они передают свои данные журнала в базу данных. Чтобы отличить источник, мне нужно указать исходный IP-адрес.
Есть ли способ получить имя хоста с помощью ведения журнала? Отслеживается/отслеживается ли IP-адрес или имя хоста в LogRecords?
В общем, как лучше всего добавить имя хоста в LogRecord?






Вы можете сделать это, добавив настраиваемый фильтр журнала и модуль форматирования, который помещает имя хоста в сообщения журнала.
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 для форматирования?
Вы не знаете. Модуль ведения журнала автоматически вставит его в ваши журналы. То же самое со временем и другими полями.
Ознакомьтесь с документацией по объекту записи журнала: docs.python.org/3/library/logging.html#logging.LogRecord.
Посмотрите этот блог для примера help.papertrailapp.com/kb/configuration/…
Вроде в блоге используют внешний модуль socket.gethostname(), а в документах LogRecord вручную печатают 192.168.0.1. В общем, мне нужно получить имя хоста из внешнего источника.
Похоже, @gobernador несколько месяцев спустя отредактировал вопрос и обновил его, включив в него фактическое имя хоста.
Более простым решением было бы предварительно заполнить строку формата именем хоста. Например:
logging.basicConfig(
#... your logging configuration,
format = "%(asctime)s {} %(message)s".format(socket.gethostname())
)
будет генерировать строку формата, например
"%(asctime)s some-hostname %(message)s"
Недостатком является то, что если имя хоста изменится, вам нужно будет перезапустить службу/приложение. Обычно это не проблема для большинства приложений, особенно если они работают на docker/k8s.
Они добавляют пользовательский фильтр. Это все, что вам нужно сделать.