Есть скрипт, написанный на 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, разделенные;

6
Bulkin 15 Авг 2012 в 22:23
Таким образом, вам необходимо изменить сервер регистрации, чтобы он знал идентификатор источника события в сообщениях журнала, передаваемых по сети. Но прежде чем мы дойдем до этого, где вы на самом деле регистрируете эти сообщения? Существует несколько подходов к добавлению контекста в сообщения журнала, но в зависимости от того, где вы ведете журнал, один из других может иметь больше смысла.
 – 
Silas Ray
15 Авг 2012 в 23:32
Звучит отлично. На самом деле мне нужно зарегистрировать другой хост или какой-то тег в другом поле.
 – 
Bulkin
16 Авг 2012 в 00:18
Единственный способ получить данные из сообщения в получателе - это проанализировать строку сообщения. SysLogHandler просто выталкивает на удаленную машину строку с ted-сообщением Format, которому предшествует специальный тег системного журнала, который кодирует степень серьезности и возможности, а также терминатор '/ 000' на конце. Вам нужно будет определить формат для сериализации ваших метаданных в сообщении (в Format) самостоятельно. Вы можете получить это с помощью LoggerAdapter или другого механизма.
 – 
Silas Ray
16 Авг 2012 в 02:09
Хорошо, похоже, это может помочь. Но я не могу понять, как использовать SysLogHandler и LogAdapter.
 – 
Bulkin
16 Авг 2012 в 10:07

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 и установку уровня журнала для корневого регистратора самостоятельно (в противном случае вы получите ошибку «нет обработчика») .

1
Silas Ray 16 Авг 2012 в 17:17
Ой, подождите, я перечитал ваш пост несколько раз, и я думаю, что это неправильно ... вы регистрируете все сообщения на одном сервере ведения журнала, но в основном вам нужно иметь возможность предоставлять настраиваемые метаданные для сообщений журнала в журнал сервер (исходный компьютер, с которого сервер агрегации получил информацию IPMI). Это правильно? У вас есть доступ к парсеру сообщений на сервере журналов?
 – 
Silas Ray
15 Авг 2012 в 23:08
Да исправить. И у меня есть доступ к регистратору. Syslog-ng и Mysql. Если есть возможность проанализировать сообщение, получите идентификатор сервера или адрес и поместите его в отдельное поле - это будет здорово.
 – 
Bulkin
15 Авг 2012 в 23:18