ProgramingTip

로그 파일 대신 데이터베이스에 기록

bestdevel 2020. 11. 25. 08:14
반응형

로그 파일 대신 데이터베이스에 기록


모든 Rails 애플리케이션 로깅을 로그 파일에 추가하거나 대신하거나 (MySQL 또는 MongoDB)로 개인 정보에 관심이 있습니다. 몇 가지 이유가 대부분은 로그 파일 분석과 관련이 있습니다. 우리는 이미 Google Analytics를 사용하고 Analytics에서 실행하기 어려운 다양한 작업을 수행하고 있습니다.

또한 로그를보고 문제를 "실시간"조사하고 싶습니다. 로그 파일을보고 보는 것이 지루한 방법이며, 로그 파일 (쉽게)에서 허용하는 것보다 더 나은 검색 및 필터링을 수행하고 싶습니다.

마지막으로, 나는 종종 사이트 방문자 행동에 더 가까운 것을 조사합니다. 예를 들어, 사이트를 내부 경로를 추적하여 오류가 발생하기 전에 사용자가보고 마지막 페이지를 볼 수 있습니다. 여러 앱 서버가있는 별도의 로그 파일이 매우 어렵게 만듭니다. 모든 데이터가 데이터베이스에 있으면 편리하게 페이지 순서를 쉽게 볼 수 있습니다. Syslog가 특정 문제 (단일 로그 파일 / 리포지토리)를 해결하는 한 가지 방법이라는 것을 알고 있습니다. 검색과 관련된 더 나은 검색 기능과 결합하고 싶습니다.

나는 사람들이 해결하기 위해 무엇을 권장하는지 궁금합니다. 로그에 직접 로그, 아니면 로그 파일을 DB에 설치하고 (데이터베이스에 직접 로그 파일 자체와 같이 실시간 / 최신 상태로 유지하는 방법은 무엇입니까?)?

내가 본 또 다른 요청을 기록하는 작은 랙 필터를 작성하고 있기 때문에 현재 로깅을 원하는 수준을 결정하고 있습니다. 이것은 일반 Rails 로깅이 모든 추가 출력 (캐시 히트 및 미스에 대한 모든 SQL 및 출력)을 놓칠 수 내 목표의 큰 부분을 달성하고 방해하지 않는 이점이있는 것입니다. 시스템의 다른 것.

어쨌든, 나는 하나의 정답을 찾고 있지 않기 때문에, 다른 사람이 같은 관점에서 무엇을하고 있을지에 대한 토론과 정보를 더 많이 찾고 있습니다.


우리 회사는 구조화 된 트래픽 정보를 MySQL 로그 데이터베이스에 직접 로깅했습니다. 이 데이터베이스는 다운 스트림에서 다른 데이터베이스로 복제됩니다. 모든 분석은 최종 데이터베이스 복제에서 실행됩니다. 우리 사이트는 상당한 트래픽을 유지합니다. 지금 큰 문제가없는 것 가변합니다. 그러나 우리 IT 부서는 현재 설정의 확장성에 점점 더 많은 관심이 있고 로그 정보를 "적절한"로그 파일에 오프로드 할 것을 제안하고 있습니다. 그런 다음 로그 파일이 동일한 다운 스트림 데이터베이스 테이블에 다시 삽입됩니다. 이 질문을 실행합니다. :)

다음은 로그 파일 대 log-db (관계형)의 주제와 관련하여 내가 볼 수있는 몇 가지 장단점입니다.

  • (적어도 Yahoo!가 클릭 추적 분석을 위해 로그 파일을 많이 사용했습니다 들었습니다).
  • 로그 파일은 sys-admin이 유지 관리하기 관리하기.
  • 로그 파일은 거의 모든 것이 있기 때문에 매우 유연합니다.
  • 로그 파일에는 과도한 구문 분석과 강력한 데이터 추출을위한 맵 축소 유형의 설정이 필요합니다.
  • log-db 구조는 애플리케이션에서 훨씬 더 가깝기 때문에 일부 기능의 처리 시간이 훨씬 단축됩니다. 이것은 축복이나 저주가 될 수 있습니다. 아마도 고도로 결합 된 애플리케이션과 분석적 코드 기반으로 끝날 가능성이 높기 때문에 장기적으로는 저주 일 것입니다.
  • log-db는 log-db가 업데이트 및 관련 삽입을 수행 할 수있는 기능을 수행하는 경우 로그 파일이 삽입되기 때문에 소음과 사용 가능한 수 있습니다.
  • log-db는 데이터베이스 파티셔닝 및 / 또는 다중 로그 데이터베이스를 사용하는 경우에도 빠르게 확장 할 수 있습니다 (다운 스트림 복제를 통해 데이터 재결합).

내 상황에서 로그 데이터베이스에 대한 오류 테스트가 필요하다고 생각합니다. 이런 식으로 얼마나 내가 얼마나 많은 헤드 룸이 있는지 알 수 있습니다.

최근에 저는 Redis, Tokyo Cabinet 및 MongoDB와 같은 키-값 / 문서 기반 데이터베이스를 조사했습니다. 높은 (쓰기) 처리량 및 다양한 기능을 제공하는 수준의 최적 위치가 될 수 있습니다. 수 많은 로그 파일을 간단한 구문 분석 및 맵보다 데이터 추출 프로세스를 간단하게 축소 할 수 있습니다.

장기적으로는 강력한 분석 데이터웨어 하우스를 갖추는 것이 중요하다고 생각합니다. 분석 데이터에서 응용 프로그램 데이터를 해제하거나 반대의 경우 큰 성과를 거둘 수 있습니다.


마지막으로 토론 범위를 넓히고 싶은 경우 StackOverflow에 유사하거나 관련된 많은 질문이 있음을 지적하고 싶습니다.


편집하다 :

rsyslog 는 매우 흥미로워합니다. MySQL에 직접 쓸 수있는 기능을 제공합니다. 루비를 사용하고 자원 로깅 보석을 원합니다. 다중 대상 로깅 기능을 제공합니다. 정말 좋아요.


기본 로깅 생성 동작을 변경하면 모든 Rails에서 로거 메소드에 응답하는 사용자 지정 로거를 생성합니다.

  • 더하다
  • 디버그, 경고, 오류, 정보, 치명적, 알 수 없음

http://github.com/rails/rails/blob/9d7aae710384fb5f04129c35b86c5ea5fb9d83a9/activesupport/lib/active_support/buffered_logger.rb

이 때문에 귀하의 로거, 당신은 당신의 개인 소유를 구현할 수 있습니다. 원할 때마다 표준 출력에 데이터베이스에 쓸 수 있습니다.

그런 다음 사용자 정의하려는 모든 기본 클래스의 기본 로거를 교체하십시오.

ActiveRecord::Base.logger = YouLogger.new

logger.rb라는 이니셜 라이저 파일을 쉽게 만들고 모든 사용자 정의 구성을 여기에 있습니다. 이런 식으로 로거는 Rails 시작시 즉시 교체됩니다.


내 사이트가 데이터베이스 모드에있는 동안 모든 문제를 데이터베이스에 기록 하기 위해 rails "exception logger"를 사용 합니다. 문제를 확인할 수있는 멋진 인터페이스가 제공됩니다. 방문자가 실시간으로 무엇을보고 있는지보고 woopra를 살펴보세요


크리스,

여기서 Dima의 기사가 중요하다고 생각합니다. (1) DB에 실시간으로 액세스 로그가있는 것에 만족하십니까? (2) Rails / 앱별 로깅에 더 관심이 있습니까?

(1)의 경우 Apache (적어도)를 사용하면 파이프 로깅을 사용하여 데이터베이스에 로깅 할 수 있습니다.

http://httpd.apache.org/docs/1.3/logs.html#piped

입력을 백그라운드에서 실행되는 프로그램을 작성하여 Postgres DB에 파싱하고 기록했습니다. 내 httpd.conf 파일은 CustomLog 지시문을 사용 하여이 프로그램에 연결됩니다.

이것은 명백한 설정이 간단하며 DB에서 로그를 분석 할 수 있다는 것을 모두 제공합니다. 특히 사용자가 오류 직전에 무엇을 추적 할 때 매우 잘 작동합니다. 그러나 로깅 프로그램의 SQL 제공, 오버플로 및 기타 보안 문제로부터 보호해야합니다.

(2)의 경우 저는 Rails 개발자가 아니므로 일반적인 접근 방식에 대해서만 이야기 할 수 있습니다. 환경 변수, 애플리케이션 데이터 또는 매우 선택적 정보 비트를 로깅하려는 경우 웹 서버 모듈 작성을 고려할 수 있습니다. 정확한 필요에 따라 조건부 로깅 지시문과 로깅 프로그램의 필터링을 조합하여 얻을 수도 있습니다.

Rails 전용 솔루션이 필요한지 아니면 더 일반적인 웹 서버 전체 솔루션이 필요한지에 따라 결정됩니다.


지금까지 답변이 없었기 때문에 기부하겠습니다.

로그를 파일이 아닌 mongodb에 저장하기 위해 rsylog 플러그인을 개발했습니다.

rsyslog + 플러그인의 전체 소스 코드는 여기 https://github.com/vpereira/rsyslogd-mongo입니다.

컴파일하려면 ./configure --help를 실행하고 사용 가능한 옵션을 확인해야합니다.


최근에 데이터베이스에 로깅하는 실수를 저질렀 기 때문에 이렇게하면 안되는 아주 좋은 이유 하나를 제공 할 수 있다고 생각합니다. 바로 트랜잭션입니다. 트랜잭션을 시작하고 트랜잭션 과정에서 많은 항목을 기록한 다음 궁극적으로 오류 조건이 발생한다고 가정 해 보겠습니다. 오류 조건을 기록하고 오, 헤이. ROLLBACK. 갑자기 방금 기록한 모든 것이 사라지고 무슨 일이 일어 났는지, 왜 그런지 알 수 없습니다.

특히 AASM과 같은 정말 유용한 라이브러리가 트랜잭션의 모든 것을 래핑하는 Rails의 맥락에서, 생각하지 못한 곳에서 트랜잭션으로 끝날 수 있으며, 이로 인해 문제를 디버그하기가 매우 어려워집니다. .

제 경우 데이터베이스에 기록한 이유는 상황에 맞는 로그가 필요했기 때문입니다. 기본적으로 특정 데이터베이스 모델과 관련된 모든 로그 항목을 조회 할 수 있어야했습니다. 그러나 정답은 이러한 로그를 로그 데이터에 더 적합한 별도의 위치에 배치하는 것입니다 (제 경우에는 쿼리 가능).

참고 URL : https://stackoverflow.com/questions/1160720/log-to-database-instead-of-log-files

반응형