So protokollieren Sie effizienter mit Timber

Die Protokollierung ist eines der am häufigsten verwendeten Dienstprogramme im Android- Framework. Es ist sehr hilfreich beim Debuggen Ihres Codes, wenn das Debuggen nach Haltepunkt einfach nicht funktioniert.

Es wird im Allgemeinen empfohlen, Log-Anweisungen in Ihren Code einzufügen. Mithilfe dieser Anweisungen können Sie die Flusskontrolle in Ihrer Anwendung verfolgen. Ebenso wird nicht empfohlen, Protokollanweisungen in Ihrem Release-Ready-Code zu haben, da diese Protokollanweisungen von jedem gelesen werden können, der sein Telefon mit einem PC verbindet. Wenn Sie Ihre Anwendung für den Play Store freigeben, wird empfohlen, alle Protokollanweisungen aus Ihrem Code zu entfernen.

Aber das kann ein echter Schmerz sein. Es gibt so viele Protokollanweisungen in Ihrem Code. Jetzt müssen Sie jeden finden und aus Ihrem Code für die Release-Version entfernen.

Ein weiteres Problem mit dem Standardprotokollierungsmechanismus besteht darin, dass Sie die TAG jedes Mal übergeben müssen, wenn Sie eine Protokollanweisung schreiben.

Wäre es nicht wunderbar, wenn sich die Protokollanweisungen in der Produktion automatisch deaktivieren würden? Wäre es nicht großartig, wenn die Log-Anweisungen beim Protokollieren automatisch den TAG / Klassennamen erfassen würden und Sie sich einfach darauf konzentrieren könnten, besseren Code zu schreiben?

Nun, Probleme wie diese und viele mehr werden durch eine bessere Protokollierungsbibliothek in Android namens Timber (von Jake Wharton) gelöst .

Es ist eine leichte, einfach zu bedienende Bibliothek. Es kümmert sich um den größten Teil der Wartung, die Sie während der Protokollierung durchführen müssen, damit Sie sich mehr auf das Schreiben von großartigem Code und weniger auf das Wartungsmaterial konzentrieren können.

Lassen Sie uns fortfahren und eine Beispielanwendung erstellen, um zu sehen, wie Sie Timber in Ihre Android-Anwendung aufnehmen und Ihr Protokollierungsleben vereinfachen können.

Loslegen

Wir werden eine einfache Android-Anwendung mit 4 Schaltflächen erstellen. Jede Schaltfläche druckt eine andere Prioritätsprotokollanweisung auf der Konsole aus.

Erstellen Sie ein neues Projekt in Android und fügen Sie eine Abhängigkeit für Timber in Ihre build.gradle-Datei auf App-Ebene ein. Zum Zeitpunkt dieses Schreibens ist dies die neueste Abhängigkeitsversion für Holz:

implementation 'com.jakewharton.timber:timber:4.7.1'

Holz initialisieren

Nachdem die Abhängigkeit heruntergeladen wurde, ist es jetzt an der Zeit, die Holzbibliothek zu initialisieren. Der beste Ort zum Initialisieren von Holz ist die Anwendungsklasse, die während der gesamten Lebensdauer der Anwendung aktiv ist. Erstellen wir also eine benutzerdefinierte Anwendungsklasse und initialisieren unsere Timber-Bibliothek darin:

class MainApplication : Application() { override fun onCreate() { super.onCreate() if(BuildConfig.DEBUG){ Timber.plant(Timber.DebugTree()) } }}

MainActivity erstellen

Lassen Sie uns nun unsere MainActivity erstellen, indem wir 4 Schaltflächen hinzufügen und für jede von ihnen Klick-Listener festlegen. Hier ist meine Datei activity_main.xml. Ich verwende ConstraintLayout als Root-Layout und füge jeweils 4 Schaltflächen für verschiedene Protokollierungsstufen hinzu.

Jetzt ist es an der Zeit, Klick-Listener für diese Schaltflächen festzulegen und bei jedem Klicken auf eine Schaltfläche eine Protokollanweisung zu drucken. Ich verwende Kotlins synthetische Bindungen anstelle von regulären findViewById-Aufrufen oder Butterknife. Hier ist meine MainActivity.kt- Datei:

class MainActivity : AppCompatActivity() {
 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main)
 btn_error.setOnClickListener { onClickedError() }
 btn_info.setOnClickListener { onInfoClicked() }
 btn_debug.setOnClickListener { onDebugClicked() }
 btn_verbose.setOnClickListener { onVerboseClicked() } }
 private fun onVerboseClicked() { Timber.v("On Verbose Clicked") }
 private fun onDebugClicked() { Timber.d("On Debug Clicked.") }
 private fun onInfoClicked() { Timber.i("On Info clicked.") }
 private fun onClickedError() { Timber.e("On Error Clicked.") }
}

Beachten Sie, dass wir keine TAG-Variable in unserer Klasse initialisieren mussten. Timber erledigt dies automatisch für Sie.

Anpassen von Timber für Debug und Release

Nun, das ist , wo Holz wirklich glänzen s. Was wir bis jetzt gemacht haben, war nichts großartiges, nur die Protokollanweisungen auf Knopfdruck zu drucken. Wie Sie wissen, ist es jedoch keine gute Idee, sich in der Produktion anzumelden. Wir werden Code schreiben, um die Protokolle für die Produktion zu deaktivieren, während sie im Debug-Modus aktiviert bleiben.

Wir werden einen if-Block schreiben, um zu überprüfen, ob sich unsere App im Debug-Modus befindet, und die Protokollierung dafür aktivieren. Wenn nicht, möchten wir Timber mithilfe eines benutzerdefinierten Baums initialisieren .

Hier ist die modifizierte MainApplication.kt- Klasse:

class MainApplication : Application() { override fun onCreate() { super.onCreate() if (BuildConfig.DEBUG) { Timber.plant(object : Timber.DebugTree() { override fun createStackElementTag(element: StackTraceElement): String? { return String.format( "Class:%s: Line: %s, Method: %s", super.createStackElementTag(element), element.lineNumber, element.methodName ) } }) } else { Timber.plant(ReleaseTree()) } }}

Wie Sie sehen können, haben wir Holz im Freigabemodus mit einem benutzerdefinierten ReleaseTree initialisiert . Lassen Sie uns nun unseren eigenen Release-Baum erstellen.

Erstellen eines benutzerdefinierten Baums

Das Erstellen eines Release-Baums ist ziemlich einfach. Erstellen Sie eine neue Kotlin-Klasse und erweitern Sie sie aus Timber.Tree. Implementieren Sie alle abstrakten Funktionen und Sie können loslegen.

Hier ist mein ReleaseTree.kt :

class ReleaseTree : @NotNull Timber.Tree() { override fun log(priority: Int, tag: String?, message: String, t: Throwable?) { if (priority == Log.ERROR || priority == Log.WARN){ //SEND ERROR REPORTS TO YOUR Crashlytics. } }
}

Wie Sie sehen, können wir das Protokoll bei jedem Fehler an einen Onlinedienst wie Firebase CrashAnalytics oder Crashlytics senden und uns nicht bei der Produktion abmelden .

Ergebnis

Vorteile der Verwendung von Timber im Vergleich zur Android-Protokollierung

Schauen wir uns einige der Vorteile der Verwendung der Timber-Bibliothek anstelle des Standard-Protokolldienstprogramms von android sdk an.

  • No need to worry about TAGS: Timber generates the TAGs automatically for you so you don’t have to worry about including a global TAG in every class.
  • No need to manually remove Log statements: As already shown, it’s really easy to disable Logging for release apps. Hence, you no longer have to go through your entire code and manually remove all the logs.
  • Customized behavior on production: In production versions, you don’t want to log, although you definitely want to log any crashes that might occur. You can implement this by using a custom debug tree (as shown above) which instead of logging to the logcat, sends the logs to your crashlytics service.
  • Customized Meta-Data: You can include customized metadata with your log statements. For example, I’ve added class name, line number and method name from which the log statement is getting printed in the implementation above. Having this data at your disposal can make debugging easier.
  • Lightweight: Does not increase your app size/method count by much. Really lightweight library as it is just a wrapper over the already existing log utility.

Conclusion

For a long time I had ignored the use of log statements and printing out better logs. As my code got bigger and problems got more complex, I realized I needed to adopt better and more efficient debugging routines. Hence, using Timber is one step in the right direction.

*Important*: I’ve created a SLACK workspace for mobile developers where we can share our learnings about everything latest in Tech, especially in Android Development, RxJava, Kotlin, Flutter, and overall mobile development in general.Click on this link to join the slack workspace. It’s absolutely free!This article was originally posted at //ayusch.com/timber-for-android

Like what you read? Don’t forget to share this post on Facebook, Whatsapp, and LinkedIn.

You can follow me on LinkedIn, Quora, Twitter, and Instagram where I answer questions related to Mobile Development, especially Android and Flutter.