Есть скрипт, написанный на Python, который анализирует данные датчиков и события с ряда серверов по IPMI. Затем он отправляет данные графика на один сервер и журналы ошибок на другой. Сервер регистрации - Syslog-ng + Mysql
Таким образом, задача состоит в том, чтобы хранить логи по владельцу, а не по хосту скрипта.
Пример кода:
import logging
import logging.handlers
loggerCent = logging.getLogger(prodName + 'Remote')
ce = logging.handlers.SysLogHandler(address=('192.168.1.11', 514), facility='daemon')
formatter = logging.Formatter('%(name)s: %(levelname)s: %(message)s')
loggerCent.setLevel(logging.INFO)
loggerCent.addHandler(ce)
loggerCent.warning('TEST MSG')
Поэтому мне нужно расширить код, чтобы я мог сказать syslog-ng, что журнал принадлежит другому хосту. Или какое-то другое предназначение.
Любые идеи?
UPD:
Итак, похоже, есть способ использовать LogAdapter. Но как его использовать:
loggerCent = logging.getLogger(prodName + 'Remote')
ce = logging.handlers.SysLogHandler(address=('192.168.1.11', 514), facility='daemon')
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)-15s %(name)-5s %(levelname)-8s host: %(host)-15s %(message)s')
loggerCent.addHandler(ce)
loggerCent2 = logging.LoggerAdapter(loggerCent,
{'host': '123.231.231.123'})
loggerCent2.warning('TEST MSG')
Ищу сообщение через TcpDump. Я ничего не вижу о хосте в LoggerAdapter. Что я делаю не так?
UPD2 :
Ну, я не нашел способа отправить хост в syslog-ng. Хотя можно отправить первый хост в цепочке, но я действительно не могу найти способ отправить его через Python Logging.
Во всяком случае, я сделал парсер в syslog-ng: Анализатор CSV
parser ipmimon_log {
csv-parser(
columns("LEVEL", "UNIT", "MESSAGE")
flags(escape-double-char,strip-whitespace)
delimiters(";")
quote-pairs('""[](){}')
);
};
log {
source(s_net);
parser(ipmimon_log);
destination(d_mysql_ipmimon);
};
log {
source(s_net);
destination(d_mysql_norm);
flags(fallback);
};
Затем я отправляю журналы в syslog-ng, разделенные;
1 ответ
Редактировать-переписывать
Вам не хватает важного шага по фактическому добавлению вашего Formatter
к вашему Handler
. Пытаться:
loggerCent = logging.getLogger(prodName + 'Remote')
loggerCent.setLevel(logging.DEBUG)
ce = logging.handlers.SysLogHandler(address=('192.168.1.11', 514), facility='daemon')
formatter = logging.Formatter('%(host)s;%(message)s')
ce.setFormatter(formatter)
loggerCent.addHandler(ce)
loggerCent2 = logging.LoggerAdapter(loggerCent, {'host': '123.231.231.123'})
loggerCent2.warning('TEST MSG')
Обратите внимание, что вы больше не будете запускать basicConfig
, поэтому вы будете нести ответственность за прикрепление Handler
и установку уровня журнала для корневого регистратора самостоятельно (в противном случае вы получите ошибку «нет обработчика») .
Похожие вопросы
Новые вопросы
python
Python — это мультипарадигмальный многоцелевой язык программирования с динамической типизацией. Он предназначен для быстрого изучения, понимания и использования, а также обеспечивает чистый и унифицированный синтаксис. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Если у вас есть вопросы о версии Python, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas, NumPy) укажите это в тегах.
SysLogHandler
просто выталкивает на удаленную машину строку с ted-сообщениемFormat
, которому предшествует специальный тег системного журнала, который кодирует степень серьезности и возможности, а также терминатор '/ 000' на конце. Вам нужно будет определить формат для сериализации ваших метаданных в сообщении (вFormat
) самостоятельно. Вы можете получить это с помощьюLoggerAdapter
или другого механизма.