バッチデータベースのロード

バッチデータベースのロード

さようなら。

私のログ管理スタックのデータベースクエリのパフォーマンスをテストする必要があります。これを行うには、6ヶ月のように見える大量のログメッセージを生成してrsyslogdに送信する必要があります。

可能ですか?その場合はどうすればよいか教えてください。

この質問に問題がある場合は、事前にお詫び申し上げます。私はこれに慣れていません。

あなたが提供できるどんな助けでも本当に感謝します。

答え1

バッチデータベースのロード

1つのアプローチは、履歴をロギングシステムデータベースに一括ロードすることです。これは、カスタムsyslogレコードを作成し、syslogデーモンによって作成されたタイムスタンプの代わりに送信者のタイムスタンプを保存したいよりも簡単です。さらに、データベースの一括ロードは、大量のsyslogメッセージを送信して解析するよりも効率的です。

欠点:データベースに直接アクセスできず、アップロードエラーが原因で既存の履歴が削除または破棄される可能性があります。

インターフェースのアップロード

ロギングシステムにはAPIがあります。これは、データベースを直接アップロードするよりも効率が悪くなる可能性がありますが、データベース全体を削除するリスクはありません。ロギングシステムがある場合の使用方法については、そのシステムのマニュアルを参照してください。

ローカルシステムログの送信

それ以外の場合、[RFC 3164] はデフォルト環境で syslog プロトコルを監視します。利用可能な既知のコードがあるかもしれませんが、これらのコードは実装によってタイムスタンプを偽造する機能を提供しないかもしれません(両方ともタイムスタンプを偽造する明確な方法を提供しません。Perllogger(1)モジュールも提供されていません) )。一方、カスタムタイムスタンプを使用してメッセージを偽造することはそれほど難しくありません。syslog(3)Net::Syslog

#include <sys/socket.h>
#include <sys/types.h>

#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#define SYSLOGMAX 1024

char buf[SYSLOGMAX];
struct addrinfo hints;

int mkcon(const char *host, const char *serv, const struct addrinfo *hints);

int
main(void)
{
    hints.ai_socktype = SOCK_DGRAM;
    int server        = mkcon("192.168.99.101", "syslog", &hints);

    for (size_t i = 0; i < 4; i++) {
        // this is the older [RFC 3164] form, which is simpler
        sprintf(buf, "<%d>Jan 11 12:13:14 host program[123]: blah%lu",
                (21 << 3) | 4, i);

        send(server, buf, SYSLOGMAX, 0);
        // network admins or logging services might get unhappy
        // if the packets or log messages show up too quick
        usleep(100000);
    }

    return 0;
}

int
mkcon(const char *host, const char *serv, const struct addrinfo *hints)
{
    struct addrinfo *peer;

    // TODO needs better error handling and better use of the
    // peer struct, etc
    int ret = getaddrinfo(host, serv, hints, &peer);
    if (ret != 0) abort();

    int server =
      socket(peer->ai_family, peer->ai_socktype, peer->ai_protocol);
    if (server == -1) abort();

    if (connect(server, peer->ai_addr, peer->ai_addrlen) == -1) abort();
    freeaddrinfo(peer);

    return server;
}

これを指摘することもできます。/dev/logこれは、ネットワークを介してパケットを転送するよりも効率的で損失が少ない可能性があります。最新のsyslogデーモンは、より信頼性の高いTCPストリームもサポートできます。動作方法については、マニュアルまたは関連RFCを確認してください。

関連情報