MongoDBエラーログのデコードには注意が必要な場合があり、貴重な時間を大量に消費する可能性があります。この記事では、ログメッセージの各部分を分析して、MongoDBエラーログを調べる方法を学習します。
MongoDBログ行の一般的な形式
バージョン3.0以降のログラインパターンは次のとおりです...
<timestamp> <severity> <component> [<context>] <message> 以前のバージョンのMongoDBのログラインパターンには次のもののみが含まれていました:
<timestamp> [<context>] <message> 各タグを見てみましょう。
タイムスタンプ
ログメッセージのタイムスタンプフィールドには、ログメッセージがログファイルに挿入された正確な時刻が格納されます。 MongoDBでサポートされているタイムスタンプには4つのタイプがあります。デフォルトの形式はiso8601-localです。 --timeStampFormatパラメータを使用して変更できます。
| タイムスタンプ形式名 | 例 |
|---|---|
| iso8601-ローカル | 1969-12-31T19:00:00.000 + 0500 |
| iso8601-utc | 1970-01-01T00:00:00.000Z |
| ctime | 12月31日水曜日19:00:00.000 |
| ctime-no-ms | 12月31日水曜日19:00:00 |
重大度
次の表に、考えられるすべての重大度レベルの意味を示します。
| 重大度 | 説明 |
|---|---|
| F | 致命的-データベースエラーにより、データベースにアクセスできなくなりました |
| E | エラー-DBの実行を停止するデータベースエラー。 |
| W | 警告-DBの潜在的に有害な動作を説明するデータベースメッセージ。 |
| 私 | 情報-「新しい接続が受け入れられました」などの情報のみを目的としたメッセージ。 |
| D | デバッグ-DBエラーのデバッグに最も役立ちます |
コンポーネント
バージョン3.0以降、ログメッセージに「コンポーネント」が含まれるようになり、メッセージの機能分類が提供されます。これにより、特定のコンポーネントを確認することで、検索を簡単に絞り込むことができます。
| コンポーネント | エラーの説明 |
|---|---|
| アクセス | アクセス制御に関連 |
| コマンド | データベースコマンドに関連する |
| コントロール | 管理活動に関連する |
| FTDC | 診断データ収集活動に関連する |
| ジオ | 地理空間形状の解析に関連 |
| インデックス | インデックス作成操作に関連 |
| ネットワーク | ネットワーク活動に関連する |
| クエリ | クエリに関連する |
| REPL | レプリカセットに関連 |
| REPL_HB | レプリカセットのハートビートに関連 |
| ロールバック | データベース操作のロールバックに関連 |
| シャーディング | シャーディングに関連 |
| ストレージ | ストレージアクティビティに関連 |
| ジャーナル | ジャーナル活動に関連する |
| 書き込み | db書き込み操作に関連 |
コンテキスト
エラーメッセージのコンテキスト部分には、通常、スレッドまたは接続IDが含まれています。他の値はinitandlistenすることができます。この部分は角括弧で囲まれています。 MongoDBへの新しい接続のログメッセージは、initandlistenとしてコンテキスト値を持ち、他のすべてのログメッセージの場合、スレッドIDまたは接続IDのいずれかになります。例:
2018-05-29T19:06:29.731+0000 [initandlisten] connection accepted from 127.0.0.1:27017 #1000 (13 connections now open)
2018-05-29T19:06:35.770+0000 [conn1000] end connection 127.0.0.1:27017 (12 connections now open) メッセージ
実際のログメッセージが含まれています。
ログファイルの場所
サーバー上のデフォルトの場所は次のとおりです:/var/log/mongodb/mongodb.log
この場所にログファイルが存在しない場合は、MongoDB構成ファイルをチェックインできます。 MongoDB構成ファイルは、これら2つの場所のいずれかにあります。
/etc/mongod.conf or /yourMongoDBpath/mongod.conf 設定ファイルを開いたら、その中のlogpathオプションを検索します。 logpathオプションは、すべてのメッセージをログに記録する場所をMongoDBに指示します。
単純なログメッセージの分析
これが典型的なMongoDBエラーメッセージの例です...
2014-11-03T18:28:32.450-0500 I NETWORK [initandlisten] waiting for connections on port 27017
タイムスタンプ:2014-11-03T18:28:32.450-0500
重大度:I
コンポーネント:ネットワーク
コンテキスト:[initandlisten]
メッセージ:ポート27017で接続を待機しています
このエラーの最も重要な部分はメッセージ部分です。ほとんどの場合、このフィールドを確認することでエラーを特定できます。メッセージが明確でない場合は、コンポーネント部分に進むことができます。このメッセージの場合、コンポーネントの値はネットワークです。これは、ログメッセージがネットワークの問題に関連していることを意味します。
エラーを解決できない場合は、このメッセージが情報提供を目的としていることを示すログメッセージの重大度を確認できます。さらに、タイムスタンプやコンテキストなどのログメッセージの他の部分をチェックして、完全な根本原因を見つけることもできます。
一般的なエラーログメッセージのデコード
-
メッセージ:
2018-05-10T21:19:46.942 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.解決策: 認証データベースに管理者ユーザーを作成する
-
メッセージ:
2018-05-10T21:19:46.942 E COMMAND [initandlisten] ** ERROR: getMore command failed. Cursor not found解決策: カーソルからタイムアウトを削除するか、カーソルのバッチサイズを増やします。
-
メッセージ:
2018-05-10T21:19:46.942 E INDEX [initandlisten] ** ERROR:E11000 duplicate key error index: test.collection.$a.b_1 dup key: { : null }解決策: 一意キー制約の違反。別のキーでドキュメントを挿入してみてください。
-
メッセージ:
2018-05-10T21:19:46.942 E NETWORK [initandlisten] ** ERROR:Timed out connecting to localhost:27017.解決策: ドライバーとサーバー間の待ち時間が長すぎるため、ドライバーは諦める可能性があります。接続文字列にconnectionTimeoutオプションを追加することで設定を変更できます。
-
メッセージ:
2018-05-10T21:19:46.942 E WRITE [initandlisten] ** ERROR: A write operation resulted in an error. E11000 duplicate key error index: test.people.$_id_ dup key: { : 0 }解決策: 競合するドキュメントから_idフィールド値の重複を削除します。
-
メッセージ:
2018-05-10T21:19:46.942 E NETWORK [initandlisten] ** ERROR: No connection could be made because the target machine actively refused it 127.0.0.1:27017 at System.Net.Sockets.Socket.EndConnect解決策: サーバーがポート27017で実行されていないか、正しいホストとポートでサーバーを再起動してみてください。
ログ管理ツール
MongoDB 3.0は、すべてのデータベースアクティビティについてより良い洞察を提供するために、ロギング機能を更新しました。市場には、MongoDB Ops Manager、ログエントリ、mtoolsなどの多くのログ管理ツールがあります。
結論
ロギングは、適切で適切なデータベース管理のためにレプリケーションやシャーディングと同じくらい重要です。データベース管理を改善するには、ログを簡単にデコードして、例外/エラーをすばやく修正できる必要があります。このチュートリアルを読んだ後、複雑なMongoDBログを分析する際により快適に感じることを願っています。