MongoDB tüm sorguları günlüğe kaydeder


169

Soru basit olduğu kadar basit ... Nasıl mongodb bir "kuyruk" mümkün günlük dosyasında tüm sorguları günlüğe nasıl?

Denedim:

  • profil oluşturma seviyesini ayarlama
  • yavaş ms parametresi başlangıcını ayarlama
  • -vv seçeneği ile mongod

/Var/log/mongodb/mongodb.log yalnızca geçerli etkin bağlantı sayısını göstermeye devam eder ...


mongod -vvbenim için çalıştı
fguillen

Yanıtlar:


259

Tüm sorguları günlüğe kaydedebilirsiniz:

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

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

db.setProfilingLevel(2) "tüm işlemleri günlüğe kaydet" anlamına gelir.


3
Bir bakışta, bu kabul edilen cevaptan daha iyi bir cevap gibi görünüyor.
Ehtesh Choudhury

2
Daha iyi değil, soruların tailable bir günlük dosyası istediğini, ancak kesinlikle yararlı, günlük dosyalarına erişiminiz olmadığı durumlarda, beni buraya getiren gibi sadece mongo kabuğu :)
inolasco

11
Profil düzeyini 2 olarak ayarlamayı denedim, ancak ikinci parametreyi -1 olarak ayarlamam gerekiyordudb.setProfilingLevel(2,-1)
andresigualada

4
Günlüklerin nereye gittiğiyle ilgilenenler için doktor şunları söylüyor: mongod, veritabanı profillerinin çıktısını system.profilekoleksiyona yazar.
totymedli

5
db.system.profile.find().pretty()benim için hiçbir şey vermez
node_saini

84

Bunu mongod'u bu şekilde başlatarak çözdüm (dövülmüş ve çirkin, evet ... ama geliştirme ortamı için çalışıyor):

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

Bu, profil oluşturmayı sağlar ve "yavaş sorgular" için eşiği 1 ms olarak ayarlar ve tüm sorguların dosyaya "yavaş sorgular" olarak kaydedilmesine neden olur:

/var/log/mongodb/mongodb.log

Şimdi şu komutu kullanarak sürekli günlük çıktıları alıyorum:

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

Örnek bir günlük:

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
Bu ekleme profile=1ve slowms=1satırlara eşdeğer olmalı /etc/mongodb.confmıdır?
Andrew Magee

/Var/log/mongodb/mongodb.log bulamadım, ancak gerekli olan konsolda oturum açıyordu. Teşekkürler
auhuman

4
Sadece ekleyebilir --profile=2için /etc/mongodb.confresmi Mongo docs göre, herhangi tüm işlemler kaydedilir.
toske

1
@auhuman "tail -f /var/log/mongodb/mongodb.log" komutu nereye yazılır?
Half Blood Prince

5
Yeniden başlatmaya gerek yok sadece kullanabilirsiniz db.setProfilingLevel(level,slowms). Örneğin: db.setProfilingLevel(2,1)düzeyi 2, yavaş sorgu eşiği 1 ms olarak ayarlar.
Abhishek Gupta


25

MongoDBgelişmiş bir profil oluşturma özelliğine sahiptir. Günlük system.profiletoplamada olur . Günlükler şu adresten görülebilir:

db.system.profile.find()

3 günlük kaydı düzeyi vardır ( kaynak ):

  • Seviye 0 - profil oluşturucu kapalı, veri toplamaz. mongod her zaman günlüğüne slowOpThresholdMs eşiğinden daha uzun işlemler yazar. Bu varsayılan profiller düzeyidir.
  • Seviye 1 - profil oluşturma verilerini yalnızca yavaş işlemler için toplar. Varsayılan olarak yavaş işlemler 100 milisaniyeden daha yavaş olanlardır. “Yavaş” işlemlerin eşiğini slowOpThresholdMs çalışma zamanı seçeneği veya setParameter komutuyla değiştirebilirsiniz. Daha fazla bilgi için Yavaş İşlemler için Eşiği Belirleme bölümüne bakın.
  • Seviye 2 - Tüm veritabanı işlemleri için profil oluşturma verilerini toplar.

Veritabanının hangi profil düzeyinde çalıştığını görmek için şunu kullanın:

db.getProfilingLevel()

ve durumu görmek için

db.getProfilingStatus()

Profil oluşturma durumunu değiştirmek için şu komutu kullanın:

db.setProfilingLevel(level, milliseconds)

Burada level, profil oluşturma düzeyi ve millisecondssorguların günlüğe kaydedilmesi gereken sürenin ms'dir. Günlüğü kapatmak için şunu kullanın:

db.setProfilingLevel(0)

Zaman damgasına göre azalan sırada sıralanan bir saniyeden uzun süren tüm sorgular için sistem profili koleksiyonuna bakılacak sorgu

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

1
Belgelere göre loglevel 0 yapar değil demek "hayır günlüğü" ama yavaş sorguları kaydeder: "profilci kapalı değil, toplamak herhangi bir veri yok her zaman günlüğüne slowOpThresholdMs eşiğinden daha uzun işlemleri yazar mongod." src: docs.mongodb.com/v3.2/tutorial/manage-the-database-profiler/...
kayn

23

Profil oluşturucu etkinliğini etkinleştirmek ve günlükleri "kuyruk" mümkün bir şekilde görmek için bir komut satırı aracı yaptım : "moğol" .

Ancak daha ilginç bir özellik (aynı zamanda tail) seçeneği ile "gerçek zamanlı" değişiklikleri görmek -fve zaman zaman grepbelirli bir işlem bulmak için sonucu ile filtre etmektir .

Https://github.com/mrsarm/mongotail adresindeki belgelere ve kurulum talimatlarına bakın.


2
bu OP'ye en eksiksiz yanıttır. ESP. 'kuyruk yapabilen' gereklilik ile ilgili.
Luke W

11

Profil oluşturma seviyesi kullanılarak ayarlanır db.setProfilingLevel(2).

Aşağıdaki komut son yürütülen sorguyu yazdırır.
Daha az / daha fazla sorgu görmek için sınırı (5) da değiştirebilirsiniz.
$ nin - profil ve dizinleri sorguları filtreleyecek
Ayrıca, yalnızca sorgu alanını görüntülemek için {'query': 1} sorgu projektörünü kullanın

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

Yalnızca sorgu projeksiyonu olan günlükler

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

10

sorguların mongodb günlük dosyasına kaydedilmesini istiyorsanız, hem günlük düzeyini hem de profili ayarlamanız gerekir, örneğin:

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

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

Yalnızca profil oluşturmanın ayarlanması sorguların dosyaya kaydedilmesini sağlamaz, böylece yalnızca

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

7

Profil oluşturucu verileri dosyalama için değil, DB'nizdeki bir koleksiyona yazılır. Bkz. Http://docs.mongodb.org/manual/tutorial/manage-the-database-profiler/

10gen'in MMS servisini kullanmanızı ve kullanıcı arayüzünde filtreleyip sıralayabileceğiniz geliştirme geliştirme profili verilerini kullanmanızı öneririm .


1
Evet, 2. düzey profil oluşturmayı etkinleştirdikten sonra veritabanına bir koleksiyon eklenir. Ancak, bir gui yeniden yüklemek veya hata ayıklama yapmak her zaman bir komut çalıştırmak zorunda günün sonunda bir PITA olduğunu ... Bu yüzden tailable bir günlük dosyası istedim.
João Rocha da Silva


4

Profil düzeyini 2 olarak ayarlamak, tüm sorguları günlüğe kaydetmek için başka bir seçenektir.


3

Mongosniff kontrol etmenizi öneririz. Bu araç istediğiniz her şeyi ve daha fazlasını yapabilir. Özellikle daha büyük ölçekli mongo sistemleri ile ilgili sorunları ve sorguların nasıl yönlendirildiğini ve nereden geldiklerini teşhis etmeye yardımcı olabilir, çünkü tüm mongo ile ilgili iletişim için ağ arayüzünüzü dinleyerek çalışır.

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


Bu sayfaya göre, sadece UNIX ortamında çalışıyor ve pencerelerdeki bin dizinimde yok. Önerilen herhangi bir windows eşdeğeri?
yayıldı

Uzak bir windows sunucusunda (masmavi bulut vb.) Veya yerel olarak bilgisayarınızda mı çalışıyorsunuz? Hepsi yerel olarak wireshark fazlasıyla yeterli olacaktır. Windows'a yüklemek için biraz belgesiz olan mongosniff.exe'yi oluşturmanız gerekir. Linux talimatlarını izliyorsunuz ancak winpcap'in geliştirme sürümünü kurmanız gerekiyor.
Daniel Williams

Cevap için teşekkürler. Moğol profillerinden ihtiyacım olan bilgiyi elde edebildim, ancak yine daha ciddi bir şey ortaya çıkarsa wireshark'ı cebimde tutacağım.
yayıldı

1

Ben sorguları geldikçe system.profile günlüğünü gerçek zamanlı olarak yazdıracak bir komut dosyası yazdım. İlk olarak diğer yanıtlarda belirtildiği gibi günlüğe kaydetmeyi etkinleştirmeniz gerekir. Buna ihtiyacım vardı çünkü Linux için Windows Alt Sistemini kullanıyorum, bunun için kuyruk hala çalışmıyor.

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



1

Bu uzun zaman önce sorulmuştur, ancak bu yine de birine yardımcı olabilir:

MongoDB profil oluşturucu, kapaklı toplama sistemindeki tüm sorguları günlüğe kaydeder . Şuna bakın: veritabanı profili oluşturucu

  1. Mongod örneğini --profile=2tüm sorguların günlüğe kaydedilmesini sağlayan seçenekle başlatın VEYA mongod örnekleri zaten çalışıyorsa, db.setProfilingLevel(2)veritabanı seçildikten sonra mongoshell'den çalıştırın . (tarafından db.getProfilingLevel()döndürülmesi gereken doğrulanabilir 2)
  2. Bundan sonra, bu system.profile koleksiyon kuyruk ve girişleri bir dosyaya yazmak için mongodb'un tailable imlecini kullanan bir komut dosyası oluşturduk . Sadece kuyruk bunu gerek günlüklerini görüntülemek için: tail -f ../logs/mongologs.txt. Bu komut dosyası arka planda başlatılabilir ve dosyadaki db üzerindeki tüm işlemleri günlüğe kaydeder.

System.profile koleksiyonu için tailable imleci kodum nodejs; MyDb'nin her koleksiyonunda gerçekleşen sorgularla birlikte tüm işlemleri günlüğe kaydeder:

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'))
    })

});

}

Python'da pymongo kullanan tailable imleci için, MyCollection için filtreleyen ve yalnızca ekleme işlemini uygulayan aşağıdaki koda bakın:

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)

Not: Uyarlanabilir imleç yalnızca sınırlı koleksiyonlarla çalışır. Bir koleksiyondaki işlemleri doğrudan günlüğe kaydetmek için kullanılamaz, bunun yerine filtre kullanın:'ns': 'MyDb.MyCollection'

Not: Yukarıdaki nodejs ve python kodunun bazıları için çok yardımcı olmayabileceğini anlıyorum. Ben sadece referans için kodları sağladım.

Dil / sürücü seçiminizde uyarlanabilir imleç ile ilgili belgeleri bulmak için bu bağlantıyı kullanın Mongodb Sürücüler

Bu logrotate sonra eklediğim başka bir özellik .


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.