모든 쿼리를 기록하는 MongoDB


169

질문은 간단합니다. 기본적으로 mongodb의 "꼬리"가능한 로그 파일에 모든 쿼리를 어떻게 기록합니까?

나는 시도했다 :

  • 프로파일 링 레벨 설정
  • 느린 ms 매개 변수 시작 설정
  • -vv 옵션을 가진 mongod

/var/log/mongodb/mongodb.log는 현재 활성 연결 수만 계속 표시합니다.


mongod -vv나를 위해 일했다
fguillen

답변:


259

모든 쿼리를 기록 할 수 있습니다.

$ mongo
MongoDB shell version: 2.4.9
connecting to: test
> use myDb
switched to db myDb
> db.getProfilingLevel()
0
> db.setProfilingLevel(2)
{ "was" : 0, "slowms" : 1, "ok" : 1 }
> db.getProfilingLevel()
2
> db.system.profile.find().pretty()

출처 : http://docs.mongodb.org/manual/reference/method/db.setProfilingLevel/

db.setProfilingLevel(2) "모든 작업 기록"을 의미합니다.


3
한눈에, 이것이 허용 된 답변보다 더 나은 답변 인 것 같습니다.
Ehtesh Choudhury

2
질문에 꼬리가 달린 로그 파일이 필요하지만 로그 파일에 액세스 할 수없는 경우, 몽고 껍질 만 여기에 가져온 것과 같은 경우에만
유용합니다.

11
프로파일 링 레벨을 2로 설정하려고 시도했지만 두 번째 매개 변수를 -1로 설정해야했습니다.db.setProfilingLevel(2,-1)
andresigualada

4
로그의 위치에 관심이있는 사람들을 위해 doc은 다음과 같이 말합니다. mongod는 데이터베이스 프로파일 러의 출력을 system.profile컬렉션에 씁니다 .
totymedli

5
db.system.profile.find().pretty()나를 위해 아무것도주지
node_saini

84

나는 이런 식으로 mongod를 시작하여 이것을 해결했다. (망치고 못생긴, 그래 ...하지만 개발 환경에서 작동한다) :

mongod --profile=1 --slowms=1 &

그러면 프로파일 링이 가능하고 "느린 쿼리"에 대한 임계 값을 1ms로 설정하여 모든 쿼리가 파일에 "느린 쿼리"로 기록됩니다.

/var/log/mongodb/mongodb.log

이제 다음 명령을 사용하여 지속적인 로그 출력을 얻습니다.

tail -f /var/log/mongodb/mongodb.log

로그 예 :

Mon Mar  4 15:02:55 [conn1] query dendro.quads query: { graph: "u:http://example.org/people" } ntoreturn:0 ntoskip:0 nscanned:6 keyUpdates:0 locks(micros) r:73163 nreturned:6 reslen:9884 88ms

6
이 추가 동등해야 profile=1하고 slowms=1에 선 /etc/mongodb.conf?
앤드류 매기

/var/log/mongodb/mongodb.log를 찾을 수 없었지만 콘솔에 로깅 중이었습니다. 감사합니다
auhuman

4
당신은 단지 추가 할 수 있습니다 --profile=2/etc/mongodb.conf공식 몽고의 문서에 따르면, 어떤 모든 작업이 기록됩니다.
toske

1
@auhuman "tail -f /var/log/mongodb/mongodb.log"명령을 작성할 위치 ??
하프 블러드 프린스

5
다시 시작할 필요없이 간단히 사용할 수 있습니다 db.setProfilingLevel(level,slowms). 예를 들어 : db.setProfilingLevel(2,1)레벨을 2로 설정하고 느린 쿼리 임계 값을 1ms로 설정합니다.
Abhishek Gupta 7


25

MongoDB정교한 프로파일 링 기능이 있습니다. 로깅은 system.profile수집 에서 발생합니다 . 로그는 다음에서 볼 수 있습니다.

db.system.profile.find()

3 가지 로깅 레벨 ( source )이 있습니다.

  • 레벨 0- 프로파일 러가 꺼져 있고 데이터를 수집하지 않습니다. mongod는 항상 slowOpThresholdMs 임계 값보다 긴 작업을 로그에 씁니다. 이것이 기본 프로파일 러 수준입니다.
  • 레벨 1 느린 조작에 대해서만 프로파일 링 데이터를 수집합니다. 기본적으로 느린 작업은 100 밀리 초보다 느린 작업입니다. slowOpThresholdMs 런타임 옵션 또는 setParameter 명령을 사용하여 "느린"작업에 대한 임계 값을 수정할 수 있습니다. 자세한 내용은 느린 작업에 대한 임계 값 지정 섹션을 참조하십시오.
  • 레벨 2- 모든 데이터베이스 조작에 대한 프로파일 링 데이터를 수집합니다.

데이터베이스가 실행중인 프로파일 링 레벨을 확인하려면 다음을 사용하십시오.

db.getProfilingLevel()

그리고 상태를 볼 수

db.getProfilingStatus()

프로파일 링 상태를 변경하려면 다음 명령을 사용하십시오.

db.setProfilingLevel(level, milliseconds)

여기서 level프로파일 링 수준 milliseconds을 나타내며 쿼리를 기록해야하는 기간 (ms)입니다. 로깅을 끄려면

db.setProfilingLevel(0)

타임 스탬프 내림차순으로 1 초 이상 걸린 모든 쿼리에 대해 시스템 프로필 모음에서 확인할 쿼리는 다음과 같습니다.

db.system.profile.find( { millis : { $gt:1000 } } ).sort( { ts : -1 } )

1
문서에 따르면 Loglevel 0 은 "로깅 없음"을 의미 하지 않지만 느린 쿼리를 기록합니다. "프로파일 러가 꺼져 있고 데이터를 수집하지 않습니다. mongod는 항상 slowOpThresholdMs 임계 값보다 긴 작업을 로그에 기록합니다." src : docs.mongodb.com/v3.2/tutorial/manage-the-database-profiler/…
kayn

23

프로파일 러 활동을 활성화하고 "꼬리"가능한 방식으로 "mongotail" 로그를 확인하는 명령 줄 도구를 만들었습니다 .

그러나보다 흥미로운 기능 (과 같은 tail)은 옵션을 사용하여 "실시간" 의 변경 사항을보고 -f때로는 grep특정 작업을 찾기 위해 결과를 필터링하는 것입니다 .

https://github.com/mrsarm/mongotail 에서 설명서 및 설치 지침을 참조하십시오.


2
이것은 OP에 대한 가장 완벽한 응답입니다. esp. '꼬리표 식'요구 사항과 관련하여.
누가 W

11

수준을 프로파일 링하면 사용하여 설정됩니다 db.setProfilingLevel(2).

아래 명령은 마지막으로 실행 된 쿼리를 인쇄합니다.
더 적거나 더 많은 쿼리를보기 위해 limit (5)를 변경할 수도 있습니다.
$ nin-프로필을 필터링하고 쿼리를 인덱싱합니다.
또한 쿼리 필드를 볼 때만 쿼리 프로젝션 { 'query': 1}을 사용하십시오.

db.system.profile.find(
{ 
    ns: { 
        $nin : ['meteor.system.profile','meteor.system.indexes']
    }
} 
).limit(5).sort( { ts : -1 } ).pretty()

쿼리 프로젝션 만있는 로그

db.system.profile.find(
{ 
    ns: { 
        $nin : ['meteor.system.profile','meteor.system.indexes']
    }
},
{'query':1}
).limit(5).sort( { ts : -1 } ).pretty()


7

프로파일 러 데이터는 파일이 아닌 DB의 컬렉션에 기록됩니다. http://docs.mongodb.org/manual/tutorial/manage-the-database-profiler/를 참조 하십시오

UI에서 필터링하고 정렬 할 수있는 10gen의 MMS 서비스를 사용하고 개발 프로파일 러 데이터를 제공하는 것이 좋습니다 .


1
예, 레벨 2 프로파일 링을 활성화하면 컬렉션이 데이터베이스에 추가됩니다. 그러나 디버깅을 수행 할 때마다 GUI를 다시로드하거나 명령을 실행 해야하는 것은 하루가 끝나면 PITA입니다 ... 그래서 꼬리가 달린 로그 파일을 원했습니다.
João Rocha da Silva


4

프로파일 링 수준을 2로 설정하는 것은 모든 쿼리를 기록하는 또 다른 옵션입니다.


3

mongosniff를 확인하는 것이 좋습니다. 이 도구는 원하는 모든 것을 할 수 있습니다. 특히 대규모 mongo 시스템의 문제와 모든 mongo 관련 통신에 대한 네트워크 인터페이스를 청취하여 쿼리가 라우팅되는 방법과 쿼리가 발생하는 위치를 진단하는 데 도움이 될 수 있습니다.

http://docs.mongodb.org/v2.2/reference/mongosniff/


그 페이지에 따르면, 그것은 UNIX 환경에서만 작동하며 Windows의 bin 디렉토리에는 없습니다. 권장되는 창문이 있습니까?
전파

원격 Windows 서버 (azure 클라우드 등) 또는 PC에서 로컬로 실행 중입니까? 그것이 로컬라면 wireshark이면 충분할 것입니다. Windows에 설치하려면 약간 문서화되지 않은 mongosniff.exe를 빌드해야합니다. 리눅스 지침을 따르지만 winpcap의 개발 버전을 설치해야합니다.
Daniel Williams

답장을 보내 주셔서 감사합니다. 나는 몽고 프로파일 러에서 필요한 정보를 얻을 수 있었지만, 더 심각한 일이 다시 발생하면 주머니에 wireshark를 보관할 것입니다.
전파

1

쿼리가 들어 오면 실시간으로 system.profile 로그를 인쇄하는 스크립트를 작성했습니다. 다른 답변에서 설명한대로 먼저 로깅을 활성화해야합니다. 꼬리가 여전히 작동하지 않는 Linux 용 Windows 하위 시스템을 사용하고 있기 때문에 이것이 필요했습니다.

https://github.com/dtruel/mongo-live-logger


1
db.adminCommand( { getLog: "*" } )

그때

db.adminCommand( { getLog : "global" } )

5
스택 오버플로에 오신 것을 환영합니다! 이 코드는 문제를 해결할 수 있지만 설명을 포함하면 게시물의 품질을 향상시키는 데 실제로 도움이됩니다.
Shree

1

이것은 오래 전에 요청되었지만 여전히 누군가를 도울 수 있습니다.

MongoDB 프로파일 러는 캡핑 된 콜렉션 system.profile 에 모든 쿼리를 기록합니다 . 이 참조 : 데이터베이스 프로파일 러

  1. 시작과 인스턴스를 mongod --profile=2모든 쿼리를 기록 가능 옵션 또는 실행 mongoshell에서, mongod 인스턴스 경우 이미 실행되고, db.setProfilingLevel(2)선택 데이터베이스 후. (이를 확인할 수있다 db.getProfilingLevel()반환해야하는,2 )
  2. 그런 다음 mongodb의 꼬리 커서 를 사용 하여이 system.profile 컬렉션을 꼬리에 붙이고 파일에 항목을 쓰는 스크립트를 만들었습니다 . 로그를 보려면 꼬리를 붙여야합니다 tail -f ../logs/mongologs.txt. 이 스크립트는 백그라운드에서 시작될 수 있으며 db의 모든 작업을 파일에 기록합니다.

system.profile 컬렉션의 꼬리 커서에 대한 내 코드는 nodejs에 있습니다. 모든 MyDb 모음에서 발생하는 쿼리와 함께 모든 작업을 기록합니다.

const MongoClient = require('mongodb').MongoClient;
const assert = require('assert');
const fs = require('fs');
const file = '../logs/mongologs'
// Connection URL
const url = 'mongodb://localhost:27017';

// Database Name
const dbName = 'MyDb';
//Mongodb connection

MongoClient.connect(url, function (err, client) {
   assert.equal(null, err);
   const db = client.db(dbName);
   listen(db, {})
});

function listen(db, conditions) {
var filter = { ns: { $ne: 'MyDb.system.profile' } }; //filter for query
//e.g. if we need to log only insert queries, use {op:'insert'}
//e.g. if we need to log operation on only 'MyCollection' collection, use {ns: 'MyDb.MyCollection'}
//we can give a lot of filters, print and check the 'document' variable below

// set MongoDB cursor options
var cursorOptions = {
    tailable: true,
    awaitdata: true,
    numberOfRetries: -1
};

// create stream and listen
var stream = db.collection('system.profile').find(filter, cursorOptions).stream();

// call the callback
stream.on('data', function (document) {
    //this will run on every operation/query done on our database
    //print 'document' to check the keys based on which we can filter
    //delete data which we dont need in our log file

    delete document.execStats;
    delete document.keysExamined;
    //-----
    //-----

    //append the log generated in our log file which can be tailed from command line
    fs.appendFile(file, JSON.stringify(document) + '\n', function (err) {
        if (err) (console.log('err'))
    })

});

}

pymongo를 사용하는 파이썬의 꼬리 커서는 MyCollection을 필터링하고 삽입 작업 만 필터링하는 다음 코드를 참조하십시오.

import pymongo
import time
client = pymongo.MongoClient()
oplog = client.MyDb.system.profile
first = oplog.find().sort('$natural', pymongo.ASCENDING).limit(-1).next()

ts = first['ts']
while True:
    cursor = oplog.find({'ts': {'$gt': ts}, 'ns': 'MyDb.MyCollection', 'op': 'insert'},
                        cursor_type=pymongo.CursorType.TAILABLE_AWAIT)
    while cursor.alive:
        for doc in cursor:
            ts = doc['ts']
            print(doc)
            print('\n')
        time.sleep(1)

참고 : 테일러 블 커서는 캡이있는 컬렉션에서만 작동합니다. 콜렉션에 대한 조작을 직접 로그하는 데 사용할 수 없으며 대신 필터를 사용하십시오.'ns': 'MyDb.MyCollection'

참고 : 위의 nodejs 및 python 코드는 일부에게는 큰 도움이되지 않을 수 있음을 이해합니다. 방금 참조를 위해 코드를 제공했습니다.

이 링크를 사용하여 언어 / 드라이버 선택에서 꼬리 커서에 대한 설명서를 찾으십시오. 하여 MongoDB 드라이버

logrotate 후에 추가 한 다른 기능입니다 .


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.