web-dev-qa-db-ja.com

crashlyticsでのデータのロギングに関する問題

AndroidアプリケーションでCrashlyticsを使用して、いくつかのサービスデータのログを取得しようとしています。しかし、ダッシュボードにログが表示されません。これを使用しました:

String myLog = getServiceData(); //myLog is not null and non-empty
CrashLytics.log(myLog);

この:

String myLog = getServiceData(); //myLog is not null and non-empty
CrashLytics.log(Log.Error, getString(R.string.app_name), myLog);

アプリケーションで例外を生成して処理しようとしましたが、結果がありません。

try {
   int a = 0;
   a = 1/a;
}
catch (Exception e) {
   CrashLytics.log(myLog);
}

また、私は Crashlyticsログが送信されない を読みました。ログデータの前にcrashlyticsを初期化する必要があります。 Crashlytics.start(this)をアクティビティのonStart()イベントに配置しましたが、ダッシュボードにログが表示されませんでした。最後に、データを記録する前にCrashlitycs.start(this)を直接配置しようとしましたが、ダッシュボードにはまだログがありません。

何が悪いのか、Crashlyticsダッシュボードでカスタムログを取得する方法を教えてください。

29
ibogolyubskiy

私も同じような状況でした。いくつかの実験で、Crashlyticsの動作のルールを推測することができました。

私がここで学んだことを共有しているので、(うまくいけば)他の人が私がそれを理解するために行った困難で時間のかかるプロセスを経る必要はありません。

Crashlyticsは、致命的な例外が発生した場合にのみ「ダッシュボードに」クラッシュレポートをアップロードします。つまり、アプリがクラッシュしたとき。クラッシュレポートがアップロードされない限り、ダッシュボードには何も表示されません。

致命的ではない例外をCrashLytics.logException(e)を使用してログに記録すると、クラッシュレポートはnotアプリが次回再起動されるまでアップロードされます。つまり、アプリが再起動するまで、Crashlyticsダッシュボードに例外が表示されますnot

LogCatに次のようなメッセージが表示されるため、アップロードがいつ行われたかを確認できます。

_07-17 19:30:41.477 18815-18906/com.foo.bar I/Crashlytics﹕ Crashlytics report upload complete: 55A9BA0C01D7-0001-462D-B8B4C49333333.cls_

Crashlyticsログメッセージmustが致命的または非致命的な例外に関連付けられ、ダッシュボードに表示されます。

さらに、例外に関連付けられていないログメッセージしないアプリの再起動後も存続します。

したがって、いくつかのメッセージをログに記録してからアプリを再起動すると、アプリが例外をスローするか、Crashlytics.logException()を使用して致命的でない例外をログに記録すると、ログメッセージは失われた。それらはダッシュボードに表示されません。

致命的な例外を発生させずに一部のメッセージをログに記録する場合は、1つ以上のCrashlytics.log()ステートメントに続けてCrashlytics.logException()を使用します。

機能することを確認するには、コードを実行してからアプリを再起動します。ダッシュボードに、致命的でない例外に対して作成された問題に関連するログが表示されます。実際には、ユーザーが一定の規則でアプリを再起動することを信頼する必要があります。

Fabric/Crashlyticsダッシュボードで、_All Events_または(ロギングコールのみを表示する場合)_Non-Fatals_を選択する必要があります。

enter image description here

58
Julian A.

crashlyticsナレッジベースによると:

ログに記録されたメッセージはクラッシュデータに関連付けられており、特定のクラッシュ自体を確認すると、Crashlyticsダッシュボードに表示されます。

そして、私の経験から、これは本当のようです。ただし、どのレポートがクラッシュレポートに関連付けられているかを判断する方法については不明です。おそらく、タイムウィンドウ(クラッシュ前後の時間)または限られた数のログ(クラッシュ前)がクラッシュレポートに関連付けられていますか?

ただし、Crashlyticsナレッジベースでは、例外をログに記録できるとしています。

ログに記録されたすべての例外は、Crashlyticsダッシュボードに「致命的でない」問題として表示されます。

したがって、try/catchを次のように変更した場合:

try {
   int a = 0;
   a = 1/a;
}
catch (Exception e) {
   CrashLytics.logException(e);
}

その後、Crashlyticsダッシュボードに表示されます。

5

これは古い質問ですが、今日同じ問題が発生していたので、自分の解決策を投稿する必要があると考えました(ただし、Kotlinにあります)。

CrashlyticsがGoogleのFirebaseサービスの一部となったため、バックグラウンドで初期化されるため、数年前に書いたソリューションを次のように更新する必要がありました。

  1. ある種のログキャッシングを実装します(先入れ先出し)。 cache-lite に基づいて1つにまとめます。
  2. この関数を、Applicationを拡張するYourApplicationClassに配置します。

        fun setExceptionHandler() {
    
           val defaultExceptionHandler = Thread.getDefaultUncaughtExceptionHandler()
    
           Thread.setDefaultUncaughtExceptionHandler { thread, ex ->
           Crashlytics.log(cacheLoggingTree.getAll().joinToString("++"))
           Crashlytics.logException(ex)
           defaultExceptionHandler.uncaughtException(thread, ex)
           }
        }
    
  3. 次に、MainActivityのonCreate関数の最後から関数を呼び出します。

         (application as YourApplicationClass).setExceptionHandler()
    

これにより、スローされた例外は最初に最新のログエントリをポストし、次に例外をログに記録します。ただし、システムに過負荷をかけないように、キャッシュする行数に注意する必要があります。

また、ログをダウンロードするときに手動でキャリッジリターンに置き換えるフラグとして++を使用しました。これは、\ nアップロードプロセスで削除されていたためです。

1
TopherC