일괄 데이터베이스 로딩

일괄 데이터베이스 로딩

안녕히 가세요;

내 로그 관리 스택의 데이터베이스 쿼리 성능을 테스트해야 하며, 이를 위해서는 6개월 된 것으로 보이는 대량의 로그 메시지를 생성하여 rsyslogd로 보내야 합니다.

가능합니까? 그렇다면 어떻게 해야 하는지 알려주십시오.

이 질문에 문제가 있으면 미리 사과드립니다. 저는 이것에 익숙하지 않습니다.

당신이 제공할 수 있는 어떤 도움이라도 정말 감사하겠습니다.

답변1

일괄 데이터베이스 로딩

한 가지 접근 방식은 기록을 로깅 시스템 데이터베이스에 일괄 로드하는 것입니다. 이는 사용자 정의 syslog 레코드를 생성하고 syslog 데몬이 만든 타임스탬프 대신 보낸 사람의 타임스탬프를 보존하려는 것보다 쉬울 것입니다. 또한 데이터베이스 대량 로드는 대량의 syslog 메시지를 전송하고 구문 분석하는 것보다 더 효율적입니다.

단점: 데이터베이스에 직접 액세스할 수 없으며, 업로드 오류로 인해 기존 기록이 삭제되거나 파기될 수 있습니다.

인터페이스 업로드

로깅 시스템에는 API가 있을 수 있습니다. 이는 데이터베이스를 직접 업로드하는 것보다 효율성이 떨어질 수 있지만 전체 데이터베이스를 삭제할 위험이 없습니다. 로깅 시스템이 있는 경우 사용 방법을 알아보려면 해당 시스템에 대한 설명서를 참조하세요.

로컬 시스템 로그 보내기

그렇지 않으면 [RFC 3164]는 기본 환경에서 syslog 프로토콜을 관찰합니다. 사용 가능한 기성 코드가 있을 수 있지만 이러한 코드는 구현에 따라 타임스탬프를 위조하는 기능을 제공하지 않을 수 있습니다(두 가지 모두 타임스탬프를 위조하는 명확한 방법을 logger(1)제공하지 않습니다. Perl 모듈도 제공되지 않습니다. 등). 반면에 사용자 정의 타임스탬프를 사용하여 메시지를 위조하는 것은 그리 어렵지 않습니다.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를 확인하세요.

관련 정보