MongoDB registreert alle zoekopdrachten

De vraag is even eenvoudig als eenvoudig… Hoe log je alle zoekopdrachten in een “staart”-logbestand in mongodb?

Ik heb geprobeerd:

  • het profileringsniveau instellen
  • de trage ms-parameter instellen vanaf
  • mongod met de -vv optie

De /var/log/mongodb/mongodb.log toont steeds het huidige aantal actieve verbindingen…


Antwoord 1, autoriteit 100%

U kunt alle zoekopdrachten loggen:

$ 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()

Bron: http://docs.mongodb.org/manual/reference /methode/db.setProfilingLevel/

db.setProfilingLevel(2)betekent “log alle bewerkingen”.


Antwoord 2, autoriteit 31%

Ik heb dit uiteindelijk opgelost door Mongod als volgt te starten (gehamerd en lelijk, ja… maar werkt voor een ontwikkelomgeving):

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

Dit maakt profilering mogelijk en stelt de drempel voor “langzame zoekopdrachten” in op 1 ms, waardoor alle zoekopdrachten als “langzame zoekopdrachten” in het bestand worden vastgelegd:

/var/log/mongodb/mongodb.log

Nu krijg ik continue log-uitvoer met het commando:

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

Een voorbeeldlogboek:

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

Antwoord 3, autoriteit 13%

Omdat het google eerste antwoord is…

Voor versie 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/


Antwoord 4, autoriteit 9%

MongoDBheeft een geavanceerde functie voor profilering. Het loggen gebeurt in de verzameling system.profile. De logs zijn te zien vanaf:

db.system.profile.find()

Er zijn 3 logboekniveaus (bron ):

  • Niveau 0– de profiler is uitgeschakeld, verzamelt geen gegevens. mongod schrijft altijd bewerkingen die langer zijn dan de slowOpThresholdMs-drempel naar het logboek. Dit is het standaard profielniveau.
  • Niveau 1– verzamelt profileringsgegevens alleen voor langzame bewerkingen. Standaard zijn langzame bewerkingen die langzamer dan 100 milliseconden.
    U kunt de drempel voor “trage” bewerkingen wijzigen met de runtime-optie slowOpThresholdMs of de opdracht setParameter. Zie het gedeelte Specificeer de drempel voor langzame bewerkingen voor meer informatie.
  • Niveau 2– verzamelt profileringsgegevens voor alle databasebewerkingen.

Om te zien op welk profielniveau de database draait, gebruik

db.getProfilingLevel()

en om de status te zien

db.getProfilingStatus()

Gebruik het commando

. om de profileringsstatus te wijzigen

db.setProfilingLevel(level, milliseconds)

Waar levelverwijst naar het profileringsniveau en millisecondsde ms is waarmee de zoekopdrachten moeten worden vastgelegd. Gebruik

. om het loggen uit te schakelen

db.setProfilingLevel(0)

De zoekopdracht die in de systeemprofielverzameling moet worden gezocht voor alle zoekopdrachten die langer dan een seconde duurden, geordend op aflopend tijdstempel, is

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

Antwoord 5, autoriteit 8%

Ik heb een opdrachtregelprogramma gemaakt om de profiler-activiteit te activeren en de logs op een “tail”ablemanier te bekijken –> “mongotail”:

$ mongotail MYDATABASE
2015-02-24 19:17:01.194 QUERY  [Company] : {"_id": ObjectId("548b164144ae122dc430376b")}. 1 returned.
2015-02-24 19:17:01.195 QUERY  [User] : {"_id": ObjectId("549048806b5d3db78cf6f654")}. 1 returned.
2015-02-24 19:17:01.196 UPDATE [Activation] : {"_id": "AB524"}, {"_id": "AB524", "code": "f2cbad0c"}. 1 updated.
2015-02-24 19:17:10.729 COUNT  [User] : {"active": {"$exists": true}, "firstName": {"$regex": "mac"}}
...

Maar de interessantere functie (ook zoals tail) is om de veranderingen in “realtime”te zien met de optie -f, en filter af en toe het resultaat met grepom een ​​bepaalde bewerking te vinden.

Zie documentatie en installatie-instructies in: https://github.com/mrsarm/mongotail


Antwoord 6, autoriteit 5%

als u wilt dat de zoekopdrachten worden vastgelegd in het mongodb-logbestand, moet u beide instellen
het logniveau en de profilering, zoals bijvoorbeeld:

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

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

Als u alleen de profilering instelt, worden de zoekopdrachten niet in het bestand vastgelegd, dus u kunt deze alleen ophalen van

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

Antwoord 7, autoriteit 4%

Zodra het profileringsniveau is ingesteld met db.setProfilingLevel(2).

Het onderstaande commando zal de laatst uitgevoerde query afdrukken.
U kunt ook de limiet (5) wijzigen om minder/meer zoekopdrachten te zien.
$nin – filtert profiel en indexeert zoekopdrachten
Gebruik ook de zoekprojectie {‘query’:1} om alleen het zoekveld te bekijken

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

Logboeken met alleen queryprojectie

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

Antwoord 8, autoriteit 2%

De profiler-gegevens worden naar een verzameling in uw database geschreven, niet naar een bestand. Zie http://docs.mongodb.org/manual/tutorial/manage-the-database- profiler/

Ik raad aan om de MMS-service van 10gen te gebruiken en daar ontwikkelingsprofilergegevens door te voeren, waar u deze kunt filteren en sorteren in de gebruikersinterface.


Antwoord 9

Ik denk dat, hoewel niet elegant, de oplogkangedeeltelijk voor dit doel worden gebruikt: het registreert alle schrijfbewerkingen – maar niet de leesbewerkingen…

Je moet replicatoon inschakelen, als ik gelijk heb. De informatie is afkomstig van dit antwoordvan deze vraag: Hoe luister ik naar wijzigingen in een MongoDB-verzameling?


Antwoord 10

Het instellen van profileringsniveau op 2 is een andere optie om alle zoekopdrachten te loggen.


Antwoord 11

db.setProfilingLevel(2,-1)

Dit werkte! het registreerde alle vraaginformatie in het logbestand van Mongod


Antwoord 12

Ik raad aan om mongosniff te bekijken. Deze tool kan alles doen wat je wilt en meer. Het kan met name helpen bij het diagnosticeren van problemen met mongo-systemen op grotere schaal en hoe vragen worden gerouteerd en waar ze vandaan komen, omdat het werkt door naar uw netwerkinterface te luisteren voor alle mongo-gerelateerde communicatie.

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


Antwoord 13

Ik heb een script geschreven dat de system.profile-log in realtime afdrukt als er vragen binnenkomen. U moet eerst inloggen zoals vermeld in andere antwoorden. Ik had dit nodig omdat ik het Windows-subsysteem voor Linux gebruik, waarvoor tail nog steeds niet werkt.

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


Antwoord 14

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

Dan

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

Antwoord 15

Dit is lang geleden gevraagd, maar dit kan iemand nog helpen:

MongoDB profiler registreert alle zoekopdrachten in de gecapte verzameling system.profile. Zie dit: databaseprofiler

  1. Start mongod-instantie met de optie --profile=2waarmee alle zoekopdrachten kunnen worden geregistreerd
    OFals mongod-instanties al actief zijn, vanuit mongoshell, voer db.setProfilingLevel(2)uit na het selecteren van database. (het kan worden geverifieerd door db.getProfilingLevel(), die 2zou moeten retourneren)
  2. Hierna heb ik een script gemaakt dat gebruikmaakt van de aanwijsbare cursorom deze system.profile-verzameling te volgen en de vermeldingen in een bestand te schrijven.
    Om de logs te bekijken hoef ik het alleen maar te volgen:tail -f ../logs/mongologs.txt.
    Dit script kan op de achtergrond worden gestart en het zal alle bewerkingen op de db in het bestand loggen.

Mijn code voor een staartbare cursor voor de system.profile-verzameling staat in nodejs; het registreert alle bewerkingen samen met vragen die plaatsvinden in elke verzameling van 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'))
    })
});
}

Voor een staartbare cursor in python die pymongo gebruikt, raadpleegt u de volgende code die filtert op MyCollection en alleen de bewerking invoegt:

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)

Opmerking: Aanpasbare cursor werkt alleen met gecapte collecties. Het kan niet worden gebruikt om bewerkingen op een verzameling rechtstreeks te loggen, maar gebruik in plaats daarvan filter: 'ns': 'MyDb.MyCollection'

Opmerking: ik begrijp dat de bovenstaande nodejs- en python-code voor sommigen misschien niet veel helpt. Ik heb zojuist de codes ter referentie verstrekt.

Gebruik deze link om documentatie te vinden voor een aanpasbare cursor in uw taal/driverkeuze Mongodb-stuurprogramma’s

Een andere functie die ik heb toegevoegd na deze logrotate.


Antwoord 16

Probeer dit pakket uit om alle zoekopdrachten te volgen (zonder oplog-bewerkingen): https: //www.npmjs.com/package/mongo-tail-queries

(Disclaimer: ik heb dit pakket precies voor deze behoefte geschreven)

Other episodes