सभी प्रश्नों को लॉग करते हुए MongoDB


169

यह प्रश्न उतना ही बुनियादी है जितना कि यह सरल है ... आप मूंगोडब में "पूंछ" सक्षम लॉग फ़ाइल में सभी प्रश्नों को कैसे लॉग करते हैं?

मैंने कोशिश की है:

  • रूपरेखा स्तर निर्धारित करना
  • धीमी गति से एमएस पैरामीटर शुरू करना
  • mvod -vv विकल्प के साथ

/Var/log/mongodb/mongodb.log केवल सक्रिय कनेक्शन की वर्तमान संख्या दिखाता रहता है ...


mongod -vvमेरे लिए काम किया
fugillen

जवाबों:


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
एक नज़र में, ऐसा लगता है कि यह स्वीकृत उत्तर की तुलना में बेहतर उत्तर है।
एहतेश चौधरी 22

2
बेहतर नहीं है, यह देखते हुए कि प्रश्न एक टाल लॉग फ़ाइल के लिए पूछते हैं, लेकिन निश्चित रूप से उपयोगी है, उन मामलों में जहां आपको लॉग फ़ाइलों तक पहुंच नहीं है, केवल मोंगो शेल, जैसे कि मुझे यहां लाया गया :)
inolasco

11
मैंने प्रोफाइलिंग स्तर को 2 पर सेट करने की कोशिश की, लेकिन मुझे दूसरे पैरामीटर को -1 पर सेट करने की आवश्यकता थी, जैसेdb.setProfilingLevel(2,-1)
andresigualada

4
रुचि रखने वालों के लिए जहां लॉग जाते हैं, डॉक्टर कहते हैं: system.profileसंग्रह के लिए डेटाबेस प्रोफाइलर का आउटपुट लिखते हैं ।
टटिमेडली

5
db.system.profile.find().pretty()मेरे लिए कुछ नहीं देता है
नोड_सैनी

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आधिकारिक मोंगो डॉक्स के अनुसार, किसी भी सभी कार्यों लॉग इन किया जाएगा।
जूल

1
@auhuman "tail -f /var/log/mongodb/mongodb.log" कमांड कहाँ लिखना है ??
हाफ ब्लड प्रिंस

5
आप बस उपयोग कर सकते हैं पुनरारंभ करने की कोई जरूरत नहीं है db.setProfilingLevel(level,slowms)। उदाहरण के लिए: db.setProfilingLevel(2,1)स्तर 2 और धीमी क्वेरी सीमा 1ms होगी।
अभिषेक गुप्ता '


25

MongoDBप्रोफाइलिंग की एक परिष्कृत विशेषता है। लॉगिंग system.profileसंग्रह में होती है। लॉग से देखा जा सकता है:

db.system.profile.find()

3 लॉगिंग स्तर ( स्रोत ) हैं:

  • स्तर 0 - प्रोफाइलर बंद है, कोई डेटा एकत्र नहीं करता है। mongod हमेशा अपने लॉग में slowOpThresholdMs थ्रेशोल्ड की तुलना में लंबे समय तक संचालन लिखता है। यह डिफ़ॉल्ट प्रोफाइलर स्तर है।
  • स्तर 1 - केवल धीमे संचालन के लिए प्रोफाइलिंग डेटा एकत्र करता है। डिफ़ॉल्ट रूप से धीमी गति से संचालन 100 मिलीसेकंड से भी धीमा होता है। आप “धीमा” संचालन के लिए थ्रेशोल्ड को धीमा कर सकते हैं धीमी गति से चलने वाले रनटाइम विकल्प या सेटपैरमीटर कमांड। अधिक जानकारी के लिए धीमे संचालन अनुभाग के लिए थ्रेसहोल्ड निर्दिष्ट करें देखें।
  • स्तर 2 - सभी डेटाबेस संचालन के लिए रूपरेखा डेटा एकत्र करता है।

यह देखने के लिए कि डेटाबेस किस प्रोफाइलिंग स्तर पर चल रहा है, का उपयोग करें

db.getProfilingLevel()

और स्थिति देखने के लिए

db.getProfilingStatus()

प्रोफाइलिंग स्थिति बदलने के लिए, कमांड का उपयोग करें

db.setProfilingLevel(level, milliseconds)

जहां levelप्रोफाइलिंग स्तर को संदर्भित करता है और millisecondsवह एमएस है जिस अवधि में प्रश्नों को लॉग इन करने की आवश्यकता होती है। लॉगिंग बंद करने के लिए, का उपयोग करें

db.setProfilingLevel(0)

टाइमस्टैम्प अवरोही द्वारा आदेशित सभी प्रश्नों के लिए सिस्टम प्रोफाइल संग्रह में देखने की क्वेरी एक सेकंड से अधिक समय के लिए होगी

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

मैंने प्रोफाइलर गतिविधि को सक्रिय करने और "पूंछ" सक्षम तरीके से लॉग देखने के लिए कमांड लाइन टूल बनाया : "मोंगोटेल"

लेकिन अधिक दिलचस्प विशेषता (जैसे भी tail) विकल्प के साथ "वास्तविक समय" में परिवर्तन देखना है -f, और कभी-कभी grepकिसी विशेष ऑपरेशन को खोजने के लिए परिणाम को फ़िल्टर करना है।

प्रलेखन और स्थापना निर्देश देखें: https://github.com/mrsarm/mongotail


2
यह ओपी के लिए सबसे पूर्ण प्रतिक्रिया है। esp। 'टेल-सक्षम' आवश्यकता के बारे में।
ल्यूक डब्ल्यू

11

एक बार प्रोफाइलिंग स्तर का उपयोग करके सेट किया जाता है 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()

10

यदि आप चाहते हैं कि प्रश्नों को लॉग फ़ाइल में लॉग किया जाए, तो आपको उदाहरण के लिए लॉग स्तर और रूपरेखा दोनों को सेट करना होगा:

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

(देखें https://docs.mongodb.com/manual/reference/method/db.setLogLevel )

केवल रूपरेखा तय करने से प्रश्नों को फाइल करने के लिए लॉग इन नहीं होगा, इसलिए आप इसे केवल प्राप्त कर सकते हैं

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

7

प्रोफाइलर डेटा आपके डीबी में एक संग्रह को लिखा जाता है, फाइल करने के लिए नहीं। Http://docs.mongodb.org/manual/tutorial/manage-the-database-profiler/ देखें

मैं 10gen की MMS सेवा का उपयोग करने की सलाह दूंगा , और वहां विकास प्रोफाइलर के डेटा को फीड करूंगा , जहां आप इसे यूआई में फ़िल्टर और सॉर्ट कर सकते हैं।


1
हाँ, स्तर 2 प्रोफाइलिंग को सक्रिय करने के बाद, डेटाबेस में एक संग्रह जोड़ा जाता है। हालांकि, एक gui को फिर से लोड करना या हर बार जब मैं डिबगिंग करता हूं, तो एक कमांड रन करता है, दिन के अंत में एक पीआईटीए होता है ... यही कारण है कि मुझे एक लॉग फ़ाइल की आवश्यकता थी।
जोओ रोचा दा सिल्वा

4

मुझे लगता है कि सुरुचिपूर्ण नहीं होने के दौरान, इस उद्देश्य के लिए ओप्लॉग को आंशिक रूप से इस्तेमाल किया जा सकता है: यह सभी लिखता है - लेकिन रीड नहीं ...

यदि मुझे सही लगता है, तो आपको प्रतिकृति को सक्षम करना होगा। जानकारी इस प्रश्न के उत्तर से है: मोंगोडीबी संग्रह में बदलाव के लिए कैसे सुनना है?


4

सभी प्रश्नों को लॉग करने के लिए प्रोफाइलिंगवेल को 2 पर सेट करना एक और विकल्प है।


3

मैं मोंगोसनिफ की जाँच करने की सलाह देता हूं। यह उपकरण आपके इच्छित सब कुछ और अधिक कर सकता है। विशेष रूप से यह बड़े पैमाने पर मोंगो सिस्टम के साथ मुद्दों का निदान करने में मदद कर सकता है और प्रश्नों को कैसे रूट किया जा रहा है और वे कहाँ से आ रहे हैं यह सभी संबंधित संबंधित संचार के लिए आपके नेटवर्क इंटरफ़ेस को सुनकर काम करता है।

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


उस पृष्ठ के अनुसार, यह केवल UNIX enviros में काम करता है, और मेरे पास इसकी बिन डायर खिड़कियों में नहीं है। किसी भी सिफारिश की खिड़कियां समान?
प्रचार किया

क्या आप दूरस्थ विंडोज़ सर्वर (एज़्योर क्लाउड, आदि) पर या स्थानीय रूप से अपने पीसी पर चल रहे हैं? यदि यह सभी स्थानीय स्तर पर वायरशार्क पर्याप्त से अधिक होगा। खिड़कियों पर इसे स्थापित करने के लिए आपको mongosniff.exe का निर्माण करना होगा जो कि थोड़ा सा अनिर्दिष्ट है। आप लिनक्स निर्देशों का पालन करते हैं लेकिन आपको winpcap के विकास संस्करण को स्थापित करने की आवश्यकता है।
डैनियल विलियम्स

उत्तर के लिए धन्यवाद। मैं उस सूचना को प्राप्त करने में सक्षम हो गया जिसकी मुझे मूँगो प्रोफाइलर से ज़रूरत थी, लेकिन अगर कुछ और गंभीर बात हुई तो मैं अपनी जेब में तारखोर रखूँगा।
प्रचारित किया

1

मैंने एक स्क्रिप्ट लिखी है जो प्रश्नों के आते ही वास्तविक समय में system.profile लॉग को प्रिंट कर लेगी। आपको अन्य उत्तरों में बताए अनुसार पहले लॉगिंग को सक्षम करने की आवश्यकता है। मुझे इसकी आवश्यकता थी क्योंकि मैं लिनक्स के लिए विंडोज सबसिस्टम का उपयोग कर रहा हूं, जिसके लिए अभी भी पूंछ काम नहीं करती है।

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


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

फिर

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

5
ढेर अतिप्रवाह में आपका स्वागत है! हालांकि यह कोड प्रश्न को हल कर सकता है, स्पष्टीकरण सहित वास्तव में आपकी पोस्ट की गुणवत्ता में सुधार करने में मदद करता है।
श्री

1

यह एक लंबे समय से पहले पूछा गया था लेकिन यह अभी भी किसी की मदद कर सकता है:

MongoDB प्रोफाइलर कैप्ड कलेक्शन सिस्टम.प्रोफाइल में सभी प्रश्नों को लॉग करता है । इसे देखें: डेटाबेस प्रोफाइलर

  1. --profile=2विकल्प के साथ मोंगॉड इंस्टेंस शुरू करें जो सभी प्रश्नों को लॉग करने में सक्षम बनाता है या यदि मोंगॉड इंस्टेंस पहले से ही चल रहा है, तो मोंगोसल से, db.setProfilingLevel(2)डेटाबेस का चयन करने के बाद चलाएं । (यह सत्यापित किया जा सकता है db.getProfilingLevel(), जिसे वापस लौटना चाहिए2 )
  2. इसके बाद, मैंने एक स्क्रिप्ट बनाई है जो इस सिस्टम को साझा करने के लिए मोंगोडब के टैब्लेट कर्सर का उपयोग करती है । एक संग्रह में प्रविष्टियां और एक फाइल में प्रविष्टियां लिखना। लॉग मैं सिर्फ यह पूंछ की जरूरत है देखने के लिए: tail -f ../logs/mongologs.txt। इस स्क्रिप्ट को पृष्ठभूमि में शुरू किया जा सकता है और यह फ़ाइल में db पर सभी ऑपरेशन को लॉग करेगा।

System.profile संग्रह के लिए नोडल कर्सर के लिए मेरा कोड नोडज में है; यह 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'))
    })

});

}

Pyongo का उपयोग करते हुए अजगर में अशुभ कर्सर के लिए, निम्न कोड देखें जो 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'

नोट: मैं समझता हूं कि उपरोक्त नोडज और अजगर कोड कुछ के लिए बहुत मददगार नहीं हो सकते हैं। मैंने केवल संदर्भ के लिए कोड प्रदान किए हैं।

अपने लिंक / ड्राइवर की पसंद में टैबलट कर्सर के लिए प्रलेखन खोजने के लिए इस लिंक का उपयोग करें Mongodb ड्राइवर्स

एक अन्य विशेषता जो मैंने इस लॉगोटेट के बाद जोड़ी है ।


0

सभी प्रश्नों (ओप्लोग संचालन के बिना) को पूंछने के लिए इस पैकेज को आज़माएँ: https://www.npmjs.com/package/mongo-tail-queries

(अस्वीकरण: मैंने इस पैकेज को इस आवश्यकता के लिए लिखा है)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.