6

IPMI によって多数のサーバーからセンサー データとイベントを解析する、Python で記述されたスクリプトがあります。次に、グラフ データを 1 つのサーバーに送信し、エラー ログを別のサーバーに送信します。ロギング サーバーは 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 に伝えることができるように、コードを拡張する必要があります。または他のデザイン。

何か案は?

更新:

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

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 にログを送信します。

4

1 に答える 1

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て設定する必要があります (そうしないと、「ハンドラなし」エラーが発生します)。

于 2012-08-15T18:47:26.297 に答える