web-dev-qa-db-ja.com

Android Log.v()、Log.d()、Log.i()、Log.w()、Log.e() - それぞれを使用する場合

さまざまなLogCatメソッドは次のとおりです。

Log.v(); // Verbose
Log.d(); // Debug
Log.i(); // Info
Log.w(); // Warning
Log.e(); // Error

各タイプのロギングを使用するための適切な状況は何ですか?私はおそらくそれがほんの少しのセマンティクスであり、おそらくそれは重要ではないことを知っていますが、Android StudioとEclipseでのLogCatフィルタリングに関しては、適切な方法で適切な方法を使っていることを知るのはいいでしょう。

309
Jake Wilson

逆の順序で行こう:

  • Log.e :これは悪いことが起こったときのためのものです。このタグは、catchステートメント内などの場所で使用してください。あなたは知っているエラーが発生しているので、エラーをログに記録していることを知っています)。

  • Log.w :なにか怪しげなことが起こっていると思われるときはこれを使ってください。あなたは完全にエラーモードでいっぱいになっていないかもしれませんが、多分あなたはいくつかの予期しない動作から回復しました。基本的に、これを使ってあなたが起こることを期待していなかったが必ずしもエラーではないものをログに記録します。 「ちょっと、これが起こった、そしてそれは奇妙な、我々はそれを調べるべきである。)のようなもののようなもの。

  • Log.i :これを使用して有用なinformation)をログに記録します。例えば:サーバーへの接続に成功したということです。

  • Log.d :これをデバッグの目的で)に使用します。印刷したい場合あなたがあなたのプログラムの正確な流れを記録することができるようにたくさんのメッセージを使用してください。変数値のログを保存したい場合は、これを使用してください。

  • Log.v :ロギングを完全に無効にしたい場合に使用します。何らかの理由でアプリの特定の部分にすべての小さなことを記録することにした場合は、Log.vタグを使用します。

そしてボーナスとして...

  • Log.wtf :絶対に、恐ろしく、神聖ながらくたが間違っているときにこれを使ってください。あなたはあなたがエラーをキャッチしているキャッチブロックを知っていますあなたが決して得るべきではありません...あなたがそれらをログに記録したいのであればLog.wtfを使用します
694
Kurtis Nusbaum

さまざまな方法が優先順位を示しています。あなたがそれらをリストアップしたように、それらは最低から最も重要へと進んでいます。コード内のデバッグログにそれらを具体的にマッピングする方法は、作業しているコンポーネントまたはアプリケーション、およびAndroidがさまざまなビルドフレーバー(eng、userdebug、およびuser)でそれらを処理する方法によって異なります。私はAndroidのネイティブデーモンでかなりの仕事をしました、そしてこれが私がそうする方法です。それはあなたのアプリに直接適用されないかもしれませんが、いくつかの共通点があるかもしれません。私の説明が曖昧に聞こえるならば、それはこれのいくつかが科学より芸術であるためです。私の基本的なルールは、できる限り効率的にし、システムのパフォーマンスを低下させることなくコンポーネントを適切にデバッグできるようにし、常にエラーをチェックしてログに記録することです。

V - さまざまな間隔で、または私のコンポーネントが処理しているイベントが発生したときの状態のプリントアウト。私のコンポーネントが送受信するメッセージ/イベントのペイロードの非常に詳細な印刷も可能です。

D - コンポーネント内で発生するマイナーイベントの詳細、およびコンポーネントが受信または送信するメッセージ/イベントのペイロード。

I - コンポーネントが受信または送信するメッセージ/イベントのヘッダー、およびコンポーネントの操作にとって重要なペイロードの重要な部分。

W - 起こりそうなこと、珍しいこと、または疑わしいこと、しかし必ずしもエラーではないこと。

E - エラー、物事が本来のように機能しているときには起こらないことを意味する。

私が人々が目にする最大の間違いは、彼らがV、D、そしてIのようなものを使いすぎて、WやEを決して使わないということです。エラーが定義上、起こることを想定していないかあなたがそれが発生したときにメッセージを記録するために安い。一方、誰かがキーを押すたびにLog.i()を実行すると、共有ロギングリソースが悪用されます。もちろん、常識を使用して、自分の管理外のもの(ネットワークエラーなど)、または緊密なループに含まれているものについてはエラーログに注意してください。

たぶん悪い

Log.i("I am here");

良い

Log.e("I shouldn't be here");

これらすべてを念頭に置いて、コードを "production ready"に近づけるほど、コードの基本ログレベルを制限することができます(Vがアルファ、Dがベータ、Iがプロダクション、さらにはWがプロダクションに必要です)いくつかの単純なユースケースを実行してログを表示し、より制限的なフィルタリングを適用するときに何が起こっているのかをまだほとんど理解できるようにする必要があります。以下のフィルタを使用して実行した場合でも、アプリが何をしているのかを知ることはできますが、すべての詳細情報が得られるとは限りません。

logcat -v threadtime MyApp:I *:S
18
John Michelau

ソースコード はいくつかの基本的な手引きを提供します。

冗長性の観点から、最低から最高のものへの順序は、ERROR、WARN、INFO、DEBUG、VERBOSEです。詳細は開発中を除いてアプリケーションにコンパイルしないでください。デバッグログはコンパイル時にコンパイルされますが、実行時に削除されます。エラー、警告、情報ログは常に保持されます。

詳細については、Kurtisの答えは死んでいます。私が付け加えるだけです:INFO以上(WARN/ERROR)には、個人を特定できる情報や個人情報を記録しないでください。さもなければ、バグ報告やロギングを含む何か他のものが汚染されるかもしれません。

6
Matthew Read

私はあなたがあなたのアプリに基本的にそれ自身のログを自己フィルタリングさせたいのであればロギングのこれらの異なるタイプのポイントがあると思います。したがって、冗長度はアプリ内の重要なものすべてをログに記録し、デバッグレベルは詳細ログのサブセットを記録し、次に情報レベルはデバッグログのサブセットを記録します。エラーログに辿り着いたら、発生した可能性のあるエラーを記録します。何かが本当にあなたのアプリのファンに当たるときのための致命的と呼ばれるデバッグレベルもあります。

一般的に言って、そのとおりです。基本的には任意です。デバッグログと情報の対比、対エラーの対比などを定義するのはあなた次第です。

3
Andi Jay

この質問はすでに答えられていますが、答えられた答えには足りない例があると思います。

そこで私がブログ記事に書いたものをここに持ってきます "Android Log Levels"

冗長

最低レベルのロギングです。あなたが伐採で本気で行きたいのなら、あなたはこのレベルで行きます。 Verboseを使用する時期とDebugを使用する時期がわかりませんでした。その違いは私には非常に恣意的なものと思われた。 Androidのソースコードを参照した後、ついに私はそれを理解しました¹「詳細は開発中以外はアプリケーションにコンパイルしないでください」詳細なレベルにすると、本番に入る前にこれらすべてのログを削除するのに役立ちます。

デバッグ

デバッグ目的のためです。これは本番環境にあるべき最低レベルです。ここにある情報は開発中に役立つことです。ほとんどの場合、本番環境ではこのログを無効にして情報の送信を減らし、問題がある場合にのみこのログを有効にします。私はアプリがサーバーと送受信するすべての情報をデバッグにログインするのが好きです(パスワードを記録しないように注意してください!!!)。これは、バグがサーバーにあるのかアプリにあるのかを理解するのに非常に役立ちます。重要な機能の出入りのログも作成します。

情報

アプリケーションの進行状況を強調する情報メッセージ用。たとえば、アプリの初期化が完了したときなどです。ユーザーがアクティビティとフラグメントの間を移動したときに情報を追加します。各API呼び出しをログに記録しますが、URL、ステータス、応答時間などの情報はほとんどありません。

警告

潜在的に有害な状況があるとき.

このログは私の経験ではトリッキーなレベルです。あなたはいつ潜在的に有害な状況に陥りますか?一般的に、またはそれで問題ないか、エラーです。私は個人的にこのレベルをあまり使用しません。私がそれを使用するときの例は、通常何度も物事が起こるときです。たとえば、ユーザーのパスワードが3回以上間違っています。これは、彼が3回間違ってパスワードを入力したことが原因である可能性があります。また、Googleのシステムで受け入れられない文字に問題がある可能性もあります。ネットワーク接続の問題も同様です。

エラー

エラーイベントアプリケーションはエラーが発生した後も引き続き実行できます。これはたとえば、nullポインタを取得することが想定されていない場所で取得された場合などです。サーバーの応答を解析中にエラーが発生しました。サーバーからエラーが発生しました。

WTF(なんというひどい失敗)

致命的とは、アプリケーションを終了させるような重大なエラーイベントのことです。 Androidでは致命的なエラーは実際にはエラーレベルですが、違いはフルスタックも追加されることです。

2

Android Studioウェブサイト は最近(私は思う)、Kurtisの答えと共に役に立つかもしれない異なるログレベルからどのような種類のメッセージを期待するかについてのアドバイスを提供しました:

  • 詳細 - すべてのログメッセージを表示します(デフォルト)。
  • デバッグ - 開発中にのみ有用なデバッグログメッセージと、このリストの下位にあるメッセージレベルを表示します。
  • 情報 - 通常使用時に予想されるログメッセージと、このリストの下位にあるメッセージレベルを表示します。
  • 警告 - まだエラーではない可能性のある問題と、このリストの下位のメッセージレベルを表示します。
  • エラー - エラーの原因となった問題と、このリストの下位にあるメッセージレベルを表示します。
  • Assert - 開発者が決して起こらないと期待する問題を表示します。

次のようなLOGを使うことができます。

Log.e(String, String) (error)
Log.w(String, String) (warning)
Log.i(String, String) (information)
Log.d(String, String) (debug)
Log.v(String, String) (verbose)

コード例:

private static final String TAG = "MyActivity";
...
Log.i(TAG, "MyClass.getView() — get item number " + position);
2
Hai Nguyen Le