29

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

間違っている点と、Crashlytics ダッシュボードでカスタム ログを取得する方法を教えてください。

4

4 に答える 4

64

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

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

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

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

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

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

ダッシュボードに表示するには、 Crashlytics ログ メッセージが致命的または致命的でない例外に関連付けられている 必要があります。

さらに、例外に関連付けられていないログ メッセージは、アプリの再起動に耐えられません。

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

致命的な例外なしでいくつかのメッセージをログに記録したい場合は、1 つ以上のCrashlytics.log()ステートメントを使用し、その後にCrashlytics.logException().

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

Fabric/Crashlytics ダッシュボードで、 or を選択する必要がありますAll Events(ロギング呼び出しのみを表示する場合) Non-Fatals

ここに画像の説明を入力

于 2015-07-18T02:59:58.077 に答える
1

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

Crashlytics は Google の Firebase サービスの一部になり、舞台裏で初期化されるため、数年前に書いたソリューションを次のように更新する必要がありました。

  1. ある種のログ キャッシング、First In First Out を実装します。cache-liteをベースにまとめてみました。
  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 が削除されるため、ログをダウンロードするときに手動でキャリッジ リターンに置き換えるフラグとして ++ を使用しました。

于 2019-03-15T20:47:23.157 に答える