복붙노트

[MONGODB] MongoDB의 모든 쿼리를 로깅

MONGODB

MongoDB의 모든 쿼리를 로깅

문제는 기본 간단만큼 ... 어떻게하여 MongoDB에서 수 로그 파일에 "꼬리"에있는 모든 쿼리를 기록 할입니까?

나는 시도했다 :

/var/log/mongodb/mongod.log은 활성 연결의 바로 현재의 수를 보여주는 유지 ...

해결법

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

    1.당신은 모든 쿼리를 기록 할 수 있습니다 :

    당신은 모든 쿼리를 기록 할 수 있습니다 :

    $ 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)는 "모든 작업 로그"를 의미한다.

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

    2.나는이 같은 mongod를 시작하여이 문제를 해결 결국 (망치 추한, 그래 ...하지만 개발 환경에서 작동) :

    나는이 같은 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
    
  3. ==============================

    3.그 첫 번째 대답을 구글 때문에 ... 버전 3

    그 첫 번째 대답을 구글 때문에 ... 버전 3

    $ mongo
    MongoDB shell version: 3.0.2
    connecting to: test
    > use myDb
    switched to db
    > db.setLogLevel(1)
    

    http://docs.mongodb.org/manual/reference/method/db.setLogLevel/

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

    4.MongoDB가이 프로파일의 정교한 기능이 있습니다. 로깅은 system.profile 컬렉션 발생합니다. 로그는에서 볼 수있다 :

    MongoDB가이 프로파일의 정교한 기능이 있습니다. 로깅은 system.profile 컬렉션 발생합니다. 로그는에서 볼 수있다 :

    db.system.profile.find()
    

    3 개 로깅 수준 (소스)가 있습니다 :

    데이터베이스가 사용 실행 수준을 프로파일 링 보려면

    db.getProfilingLevel()
    

    및 상태를 확인합니다

    db.getProfilingStatus()
    

    프로파일 상태를 변경하려면, 다음 명령을 사용

    db.setProfilingLevel(level, milliseconds)
    

    레벨이 프로파일 레벨 밀리 초를 의미 어디 쿼리가 기록해야하는 기간의 MS이다. 로깅 사용을 해제하려면

    db.setProfilingLevel(0)
    

    타임 스탬프 내림차순으로 정렬 일초보다 더 오래 걸렸다 모든 쿼리가 될 것입니다에 대한 쿼리는 시스템 프로파일 컬렉션 볼 수 있습니다

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

    5."mongotail"나는 프로파일 활동을 활성화하고 "꼬리"수 방법으로 로그를 볼 수있는 명령 줄 도구를했다.

    "mongotail"나는 프로파일 활동을 활성화하고 "꼬리"수 방법으로 로그를 볼 수있는 명령 줄 도구를했다.

    그러나 (도 꼬리 같은) 더 재미있는 기능은 -f 옵션을 "실시간"의 변화를보고, 때때로 특정 작업을 찾을 GREP으로 결과를 필터링하는 것입니다.

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

  6. ==============================

    6.프로파일 레벨 db.setProfilingLevel (2)를 이용하여 설정되면.

    프로파일 레벨 db.setProfilingLevel (2)를 이용하여 설정되면.

    아래의 명령은 마지막으로 실행 된 쿼리를 인쇄합니다. 잘 이하 / 더 쿼리를 볼 수대로 제한 (5) 변경 될 수 있습니다. $ 닌은 - 프로필 및 인덱스 쿼리를 필터링합니다 보기 전용 쿼리 필드 : 또한, 쿼리 투사 {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. ==============================

    7.프로파일 러 데이터가없는 파일에, 당신의 DB에서 수집에 기록됩니다. http://docs.mongodb.org/manual/tutorial/manage-the-database-profiler/ 참조

    프로파일 러 데이터가없는 파일에, 당신의 DB에서 수집에 기록됩니다. http://docs.mongodb.org/manual/tutorial/manage-the-database-profiler/ 참조

    당신은 UI에서 그것을 필터링하고 정렬 할 수있는 나는,이 10gen의 MMS 서비스를 사용하는 것이 좋습니다, 사료 개발 ​​프로파일 데이터 것입니다.

  8. ==============================

    8.당신은 쿼리 로그 파일을 MongoDB를 위해 로그인하려는 경우, 당신은 모두를 설정해야 로그 레벨 및 예를 들어 같은 프로파일 :

    당신은 쿼리 로그 파일을 MongoDB를 위해 로그인하려는 경우, 당신은 모두를 설정해야 로그 레벨 및 예를 들어 같은 프로파일 :

    db.setLogLevel(1)
    db.setProfilingLevel(2)
    

    (https://docs.mongodb.com/manual/reference/method/db.setLogLevel 참조)

    그래서 당신은 단지에서 그것을 얻을 수, 쿼리가 파일에 기록하지 않았을 경우에만 프로파일 설정

    db.system.profile.find().pretty()
    
  9. ==============================

    9.이 모든 쓰기를 기록 -가 아니라 읽기 ... : 나는 우아한되지 동안 oplog는 부분적으로이 목적을 위해 이용 될 수 있다고 생각

    이 모든 쓰기를 기록 -가 아니라 읽기 ... : 나는 우아한되지 동안 oplog는 부분적으로이 목적을 위해 이용 될 수 있다고 생각

    내가 옳다 경우, replicatoon를 활성화해야합니다. 어떻게 MongoDB의 수집에 대한 변경 사항을 청취 :이 정보는이 질문에서이 대답에서 무엇입니까?

  10. ==============================

    10.2 profilinglevel를 설정하면 모든 쿼리를 기록하는 또 다른 방법입니다.

    2 profilinglevel를 설정하면 모든 쿼리를 기록하는 또 다른 방법입니다.

  11. ==============================

    11.나는 mongosniff을 확인하는 것이 좋습니다. 이 캔 도구를 사용하면 원하는 모든 것을하고 더 많은 일을 할 수 있습니다. 특히 그것은 더 큰 규모의 몽고 시스템 및 방법 쿼리가 라우팅되고 어디 그들이 모든 몽고 관련 통신을위한 네트워크 인터페이스에 청취하여 작동하기 때문에에서 오는와 진단 문제에 도움이 될 수 있습니다.

    나는 mongosniff을 확인하는 것이 좋습니다. 이 캔 도구를 사용하면 원하는 모든 것을하고 더 많은 일을 할 수 있습니다. 특히 그것은 더 큰 규모의 몽고 시스템 및 방법 쿼리가 라우팅되고 어디 그들이 모든 몽고 관련 통신을위한 네트워크 인터페이스에 청취하여 작동하기 때문에에서 오는와 진단 문제에 도움이 될 수 있습니다.

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

  12. ==============================

    12.내가 쿼리 당신은 다른 답변에 명시된 바와 같이 먼저 로그인 활성화해야합니다.에 와서 실시간으로 system.profile 로그를 출력하는 스크립트를 썼다. 내가하는 꼬리 여전히 작동하지 않는, 리눅스 윈도우 서브 시스템을 사용하고 있기 때문에이 필요했습니다.

    내가 쿼리 당신은 다른 답변에 명시된 바와 같이 먼저 로그인 활성화해야합니다.에 와서 실시간으로 system.profile 로그를 출력하는 스크립트를 썼다. 내가하는 꼬리 여전히 작동하지 않는, 리눅스 윈도우 서브 시스템을 사용하고 있기 때문에이 필요했습니다.

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

  13. ==============================

    13.

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

    그때

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

    14.이것은 오래 전에 요청하지만,이 수도 여전히 도움이 누군가했다 :

    이것은 오래 전에 요청하지만,이 수도 여전히 도움이 누군가했다 :

    MongoDB의 프로파일이 덮인 수집 system.profile의 모든 쿼리를 기록합니다. 데이터베이스 프로파일이 참조

    system.profile 수집 tailable 커서 내 코드 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를 사용하여 파이썬에서 tailable 커서를 들어, 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)
    

    참고 : Tailable 커서 만 덮인 컬렉션과 함께 작동합니다. 'NS'을 : 직접 컬렉션 작업 로그 대신 필터를 사용하는 데 사용할 수 없습니다 'MyDb.MyCollection'

    참고 : 나는 위의 nodejs 및 파이썬 코드가 일부 훨씬 도움이되지 않을 수 있음을 이해합니다. 난 그냥 참조를 위해 코드를 제공하고 있습니다.

    당신의 languarge / 드라이버 선택 MongoDB의 드라이버에 tailable 커서에 대한 문서를 찾으려면이 링크를 사용하여

    내가이 logrotate에 후에 추가 한 또 다른 특징.

  15. ==============================

    15.(oplog 작업없이) 모든 쿼리 꼬리에이 패키지를 사용 해보세요 : https://www.npmjs.com/package/mongo-tail-queries

    (oplog 작업없이) 모든 쿼리 꼬리에이 패키지를 사용 해보세요 : https://www.npmjs.com/package/mongo-tail-queries

    (면책 조항 :이 필요성에 대해 정확히이 패키지를 썼다)

  16. from https://stackoverflow.com/questions/15204341/mongodb-logging-all-queries by cc-by-sa and MIT license