2014-02-17 145 views
3

我們正在嘗試在MongoDB中記錄讀取&寫入操作。我們希望將實際的查詢記錄到文件中。 我們使用下面的配置(在副本集主節點):MongoDB - 記錄寫入和讀取查詢

logpath=/.../mongodb.log 
logappend=true 
profile=2 
slowms=1 
diaglog=3 
verbose=true 
vvvv=true 

據我瞭解,這應該工作。但是,在日誌中,我們只能看到什麼是查詢類型(drop/insert/update等)和集合,而不是執行的實際查詢。

編輯:澄清:我們希望將讀/寫查詢記錄到常規mongodb日誌文件(與您在MySQL中可以做的相同)。

可能是什麼問題?任何人有任何想法? 謝謝!

+0

什麼版本的mongodb? –

回答

0

您可以打開數據庫分析,它會將所有操作的集合:

db.setProfilingLevel(2)

有對性能的影響很小。

文檔:http://docs.mongodb.org/manual/tutorial/manage-the-database-profiler/

編輯: 要查看剖析數據,你可以閱讀db.system.profile集合。

+0

與配置文件中的'profile = 2'不是一回事嗎? – Ayelet

+0

這是正確的。爲了查看分析器數據,您可以閱讀db.system.profile集合;那就是數據寫入的地方,而不是日誌。 (http://docs.mongodb.org/manual/tutorial/manage-the-database-profiler/#view-profiler-data) – Rishi

+0

對不起,但我不明白它與我所做的有什麼不同(並沒有工作)。 – Ayelet

2

首先請注意:

由於數據庫探查器性能產生負面影響,只有 啓用生產系統戰略間隔分析和儘可能少 。

您還可以啓用每個數據庫的分析器以減少對mongo實例的分析影響。 slowms=1在你的情況下是多餘的profile=2將記錄所有查詢,無論它們花費多長時間。

這裏有一個簡單的測試,以檢查無需額外CONFIGRATION查看配置文件數據:

db.setProfilingLevel(2) 
db.testProf.insert({x : 1}) 
db.testProf.update({x : 1}, {$set : {x : 2}}) 
db.testProf.find({x : 2}) 
db.testProf.remove({x : 2}) 
db.setProfilingLevel(0) 

現在,你可以查詢詳細的信息分佈數據:

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

這應該顯示運行信息用於上面的每個操作。下面是從更新操作細節的摘錄:

"op" : "update", 
    "ns" : "profDb.testProf", 
    "query" : { 
      "x" : 1 
    }, 
    "updateobj" : { 
      "$set" : { 
        "x" : 2 
      } 
    }, 
    "nscanned" : 1, 
    "nupdated" : 1, 
    "fastmod" : true, 
    "keyUpdates" : 0, 
    "numYield" : 0, 
    "lockStats" : { 
      "timeLockedMicros" : { 
        "r" : NumberLong(0), 
        "w" : NumberLong(1131) 
      }, 
      "timeAcquiringMicros" : { 
        "r" : NumberLong(0), 
        "w" : NumberLong(5) 
      } 
    } 

query字段包含的更新標準,而updateobj字段包含對文檔的更新操作運行。 如果您執行相同的操作,並且query字段仍爲空,則可能需要爲所有文檔運行更新,刪除等操作。

有關如何解釋的個人資料數據,請參見該文檔的詳細信息 - Database Profiler Output

編輯: 只注意到diaglog=3配置。這個主要用於記錄和重放操作。這會保留非常詳細的日誌,並且也會對性能產生負面影響,我認爲您應該跳過它。分析足以達到想要的效果。

編輯: 不知道爲什麼你需要保存到文件中,因爲我覺得它更方便易有它集合中的文件數據。你可以查詢任何其他收集您感興趣的數據,我不知道任何方式直接流文件數據到一個文件,但您可以導出它像任何時間:

mongoexport --db profDb --collection system.profile --out profiler.json 

你diaglog將所有數據寫入一個文件,但是這是一種內部格式,不方便用戶閱讀。

diaglog供內部使用,不適用於大多數用戶。

希望它有幫助!

+0

感謝您的回答。也許我誤解了它,但你建議查看mongo shell中的查詢,但我們需要它們登錄到日誌文件... – Ayelet

+0

不知道爲什麼你需要它在一個文件中看到我的更新 –

+0

這似乎很奇怪對我來說,你不能簡單地將查詢記錄到常規的mongodb日誌文件(例如與MySQL相同)。您提出的解決方案對我們的目的不太實際。 – Ayelet