6

Mongoid3.0でmap/reduce操作を書いています。printこのステートメントを使用してJS関数をデバッグしようとしています。これは、MongoDBドキュメントからのトラブルシューティングの提案です。例:

reduce = %Q{
   function(user_id, timestamps) {
      var max = 0;
      timestamps.forEach(function(t) {
        var diff = t.started_at - t.attempted_at;
        if (diff > max) { max = diff; }
      });
      print(user_id + ', ' + max);
      return max;
    };
  }

 MyCollection.all.map_reduce(map, reduce).to_a

残念ながら、printステートメントからの出力はコンソールにもログにも表示されません。これは、DB、ドライバー、Moped、または介在するレイヤーの間のどこかで抑制されているようです。これをオンにする方法はありますか?

4

2 に答える 2

13

printステートメントのログが MongoDB サーバー ログに記録されていることがわかります。OSXでは、つまり/usr/local/var/log/mongodb/mongo.log

于 2012-12-20T00:55:10.247 に答える
11

投稿者のコメントによると、最初のステップは、mongodサーバー ログを見ていることを確認することです。これをローカルで行う最も簡単な方法は、あまり知られていない HTTP インターフェースからmongod:にアクセスすることですhttp://localhost:28017。これは、サーバーがデフォルトの場所にインストールされていない場合でも機能するため、ログは OS 固有のデフォルトの場所 ( /usr/local/var/log/mongodb/mongo.logMac OS X など) にはありません。非標準でこれにアクセスする方法については、ドキュメントを参照してください。展開環境。

それでも問題が解決しない場合は、MongoDB M/R のデバッグをさらに深く掘り下げる必要がありますが、これはいくつかの理由で注意が必要です。

  1. M/R ジョブは、DB の残りの部分から分離された JS スコープで実行されます
  2. M/R ジョブは、M/R 出力ドキュメント以外には書き込めません
  3. MongoDB のロガーは、ロギング ストリームに何を出力するかについて裁量権を持っています。

以下は、本番環境での Mongo M/R の広範な使用に基づく私の提案です。

ログレベルを上げる

突然、以前は見えなかったprint出力の一部が表示されます。見え始めるまで、一度に 1 レベルずつ行ってください。

use admin
db.runCommand( { setParameter: 1, logLevel: 2 } )

ログ レベルは 0 ~ 5です。 setParameterを参照してください。-v、-vv、...、-vvvvv を使用して、サーバーの起動時にこれを行うこともできます。

プロファイリング レベルを最大に上げます (2)

プログラムで検査できるデータの枯渇 (プロファイリング コレクション) を提供するため、特に高いログ レベルと組み合わせると、これが役立つことがわかりました。ドキュメントを参照してください。

非常に大きな M/R ジョブを実行している場合、これはパフォーマンスに悪影響を及ぼす可能性があります。

M/R による Piggyback デバッグ出力

アイデアは簡単です。必要なデバッグ情報を含むオブジェクトの配列を_debugフィールドに追加して、出力されたすべてのドキュメントに追加し、reduce フェーズに合わせてフィルター + 連結します。このようにして、_debug配列は出力コレクションになります。特定の問題をすばやく見つけたい場合は、インデックスを作成することもできます。

お役に立てれば。幸運を!

于 2012-12-20T00:48:35.703 に答える