복붙노트

[REDIS] 로깅 레디 스

REDIS

로깅 레디 스

나는 웹 응용 프로그램 로깅을 위해 레디 스를 사용하는 생각입니다. 나는 거기 레디 스 큐 / 목록에 로그를 덤프하여이 방법을 사용하는 사람들, 그리고 다음 예약 된 근로자가 디스크에 기록 할 것을 봤.

http://nosql.mypopescu.com/post/8652869828/another-redis-use-case-centralized-logging

나는 왜 직접 디스크에 지속 레디 스를 사용하는 것이 이해 추구하고자하는? 나는 데이터베이스, 애플리케이션 서버에서 분리 레디 스가 기입하는 작은 서버를 할당 한 경우, 직접 로그를 지속 레디 스를 사용하는 것이 가능하다?

나는 또한 예를 들어 등을 날짜로 레디 스, 사용자, 쿼리에 도움이 필요, 각 로그는 다음과 같다.

datetime=>2012-03-24 17:45:12
userid=>123
message=>test message
category=>my category

어떻게 특정 범주의 특정 사용자에 의해, 날짜 시간 범위 내에서 결과를 조회 할 수 있습니다?

감사!

해결법

  1. ==============================

    1.당신은 (는 디스크에 데이터를 유지할 수 있습니다 경우에도) 레디 스는 인 메모리 데이터베이스는 것을 명심해야합니다. 당신은 레디 스에 넣어 데이터는 메모리에 적합해야한다.

    당신은 (는 디스크에 데이터를 유지할 수 있습니다 경우에도) 레디 스는 인 메모리 데이터베이스는 것을 명심해야합니다. 당신은 레디 스에 넣어 데이터는 메모리에 적합해야한다.

    당신이 언급 문서의 제안은 분산 큐잉 시스템으로 레디 스를 사용하는 방법에 대한 것입니다. 작업자 프로세스는 항목을 큐에서 제거하고 디스크에 쓰기 때문에 레디 스 메모리에 많은 항목이 없습니다. 이 디자인은 결함이 있습니다 작업자 프로세스가 디스크에 충분히 빠르게 데이터를 기록 할 수없는 경우, 레디 스 메모리 소비가 폭발 -이 구성에 의해 제한되어야하므로 (레디 스 maxmemory 매개 변수) 또는 소프트웨어 (삽입시 큐 트림, 또는 빈 큐는) 가득 차면.

    당신은 레디 스에서 쓰는 모든 데이터가 (그들은 레디 스 자체 디스크에 지속하더라도) 메모리에 저장되기 때문에 이제 당신의 제안은 정말 작동하지 않습니다.

    또 다른 점은 레디 스를 조회 할 수 있습니다. 레디 스 그것은 단지 이전에 정의 된 액세스 경로를 포함하는 명령, 더 임시 쿼리 메커니즘을 지원하지 않습니다, 관계형 데이터베이스가 아닙니다. 당신이 다른 매개 변수 데이터를 검색 할 경우, 삽입시에 (... 등, 세트를 소트 세트) 모든 가능한 검색을 예측하고 관련 데이터 구조를 구축해야합니다.

    또 다른 가게 (MongoDB를, 또는 관계형 데이터베이스) 아마 사용 사례에 대한 훨씬 더 잘 맞는 것입니다.

  2. ==============================

    2.당신은 다음과 같은 구조의 로그를 저장할 수 있습니다 :

    당신은 다음과 같은 구조의 로그를 저장할 수 있습니다 :

    "logs:{category}:{userid}:{datetime}" = message
    

    그리고 다음과 같이 요청 :

    "logs:*:{userid}:{datetime}"
    

    또는

    "logs:{category}:*:{datetime}"
    
  3. ==============================

    3.레디 스 메모리의 데이터 저장소입니다. 데이터를 디스크에 직접 지속성 저장 또는 BGSAVE 명령으로 가능하다. 지속성 (RDB / AOF)는 메모리 저장 장치에 부가 기능이다.

    레디 스 메모리의 데이터 저장소입니다. 데이터를 디스크에 직접 지속성 저장 또는 BGSAVE 명령으로 가능하다. 지속성 (RDB / AOF)는 메모리 저장 장치에 부가 기능이다.

    언급 한 요구 사항 디스크에 로그를 저장하는 것입니다. 대신 메모리 데이터 스토어의 (RabbitMQ 같은) 메시지 큐 중 하나를 사용하여 일을 간단해야한다. (로그 먹을 업되지 않습니다 메모리)

    로그를 생성하는 응용 프로그램은 큐에 별도의 소비자 로그 메시지를 소모하고 디스크에 쓰기로 게시 할 수 있습니다.

    로그의 모든 블록은 구조 같은 것을 (C / C ++ 예를 들어)로 저장되어야한다 :

       struct log{
         long datatime;
         string userId;
         string message;
         string category;
       };
    

    문자열이 구조를 직렬화하고 값으로 레디 스에 저장합니다.   같은 값에 대한 키는 것과 같다 :   키 = userId를 DELIMITER + + + 카테고리 DELIMITER + datatime

    당신은 다시 모든 키를 가져옵니다 기능을 가지고 특정 키워드에 대한 데이터 목록을 가져 오지를 분할 할 수 있습니다.

  4. ==============================

    4.당신이 점수로 타임 스탬프와 소트 세트를 사용하는 경우는 아주 잘 작동합니다. 단점은 메모리 문제 (다른 답변에서 언급 한) 당신이 할 수있을거다 수동 쿼리입니다.

    당신이 점수로 타임 스탬프와 소트 세트를 사용하는 경우는 아주 잘 작동합니다. 단점은 메모리 문제 (다른 답변에서 언급 한) 당신이 할 수있을거다 수동 쿼리입니다.

    나는 경우에 누군가가 관심, 그것으로 주위를 연주했습니다 https://github.com/hugollm/redis-logs-example

  5. from https://stackoverflow.com/questions/13169842/redis-for-logging by cc-by-sa and MIT license