[Tutorial]Logging mit Android (log4j)

  • Antworten:5
  • OffenNicht stickyNicht beantwortet
  • Forum-Beiträge: 359

05.01.2015, 17:05:17 via Website

In diesem kurzen Tutorial möchte ich einmal kurz das loggen unter Android beschreiben.
Da Logging von vielen Entwicklern vernachlässigt wird (ganuso wie das kommentieren), denke ich das bei einem Schritt hin zur Professionalität dieses Thema mal angesprochen werden sollte.

Android bietet von sich aus eine möglichkeit um in Andorid Logausgaben im Logcat zu erzeugen.
Diese basiert auf utillogging.

Jedoch ist mit dieser das Logging relativ "statisch".
Soll bedeuten, wenn ich damit Loggen will habe ich die Möglichkeit mitzuteilen unter welchem Level die Information angezeigt werden soll und welchen "Tag" dies zugewiesen werden soll.

ein kleines Bespiel:

Meine Anwendung heißt de.androidpit.loggingexample

Nun kann ich im Code wie folgt loggen:

Log.e("de.androidpit.loggingexample","error");
Log.i("de.androidpit.loggingexample","info");

usw...

Auch hier nachzulesen: http://developer.android.com/reference/android/util/Log.html

Ich persönlich komme aus der Java Welt, wo schon seit ewigen Zeiten Log4J(bzw. self4j) der geheime (da nicht offiziell in Java enthalten) Standard ist.
Der Vorteil von log4J ist:

  1. eine große Anzahl an Logging Möglichkeiten durch sogenannte Appender
  2. das freie definieren des aussehen einer Logmeldung ist hier ein mächtiges Werkzeug.
  3. Das definieren in welcher Klasse/Package welches Level ausgegeben wird.

Log4J gibt es auch in abgeschwächter form für Android.
Nennt sich android-logging-log4j und kann hier als jar-lib gedownloadet werden.
Leider bietet es im Moment noch relativ wenig Möglichkeiten des Logging aber diese sind schon größer als das was utillogging bietet.
Ein weiterer Vorteil:
Log die in einer Lib zum Beispiel commons-logging nutzen, erkennen diesen Logger und fügen ihre Logmeldungen unter euren Spezifikationen an.
Die Verwendung von log4J für Android ist im Grunde einfach.
Zuerst benötigt ihr 2 Jar Libs zum einen

  1. http://code.google.com/p/android-logging-log4 -> android-logging-log4j-1.0.3.jar
  2. https://logging.apache.org/log4j/1.2/download.html --> log4j-1.2.17.jar
    oder natürlich andere Versionen dieser Produkte.
    Diese beiden Lib´s fügt ihr eurem Projekt hinzu.
    Nun erstellt ihr am besten in eurem Projekt eine Klassen:
    Ich nenne Sie mal Log4JConfigurator
    Diese kann zum Beispiel wie folgt aussehen:

     public class Log4JConfigurator {
                private static final Logger log = Logger.getLogger(Log4JConfigurator.class);
                /**
                 * Laedt die Log4JConfiguration
                 */
                public static void iniziereConfig(){
                        final LogConfigurator logConfigurator = new LogConfigurator();//erzeugt den eigentlichen Konfigurator
                        logConfigurator.setRootLevel(Level.ALL);//setzt das hauplevel des Loggens
                        logConfigurator.setUseFileAppender(false);//setzt ob das Log in ein File gespeichert werden soll (Ja das geht)
                        logConfigurator.setUseLogCatAppender(true);//setzt ob das log im Logcat ausgegeben werden soll
                        logConfigurator.configure();//aktiviert die konfiguration
    
          }
    

    }

Hier hat man jetzt nun eine Vielzahl von Möglichkeiten.
Z.B.: kann man mit setLevel("[packagename]", Level.ERROR);für ein(e) Klasse/Package ein anderes Loglevel definieren
Auch kann man die PATTERN definieren.
Heißt: die Darstellung des Logs (eine Liste der möglichen PATTERN findet ihr hier)

Wenn ihr nun in eurem Programmcode Loggen wollt:
könnt ihr das wie folgt tun:

  1. Definiere eine Globale Variable --> private static final Logger log = Logger.getLogger([Klasse in der sich diese Variable befindet].class);`
  2. schreibe an der Stelle an der ihr loggen möchtet : log.info("Info Nachricht"); log.debug("Debug Nachricht");etc.

Über das Level könnt ihr definieren welche tiefe eure Nachrichten ausgegeben wird.
Folgende Stufen gibt es:
FATAL, ERROR, WARN,INFO,DEBUG
Bedeutet:
Die Lognachrichten sind hieratisch.
Wenn zum Beispiel das Level auf INFO steht, werden Meldungen der Folgenden Stufe ausgegeben:
FATAL, ERROR, WARN,INFO
Steht das Level auf ERROR, nur noch folgende Stufen: FATAL, ERROR usw.

Das Schöne an dieser Lösung ist, das man strikt zwischen Meldungen und Ausgabemedien unterscheidet.
Somit kann man das WO und Wie ersteinmal zurückstellen.
Man kümmert sich erstmal nur um das WAS geloggt wird.

Dies Sollte für den Einstieg reichen. Bei Zeiten werde ich das noch etwas verfeinern.
Fertig :)
Gruß
Fabian

— geändert am 08.01.2015, 12:43:32

Michael K.stefan m

Antworten
  • Forum-Beiträge: 359

06.01.2015, 11:47:31 via Website

Sollten euch noch informationen fehlen oder ihr fragen haben. bin ich gerne bereit das tutorial noch zuerweitern.

Antworten
  • Forum-Beiträge: 5

19.10.2017, 12:42:57 via Website

Salut Fabian,
ich versuch schon länger herauszufinden wie und was beim loggen so passiert.
Es gibt zig Programm (via ADB) oder Apps die einen Live-Log zeigen aber wie komme ich z.B. an logs heran die vor dem Start der jeweiligen App generiert worden.
Generell geht es mir darum, wie kann ich das schreiben von Logeinträgen beeinflussen, bzw. festhalten ohne ein App am laufen zu haben.
In den Developer options (zumindest in LineageOS) gibt es zudem die Einstellung Logger buffer sizes und Store logger data persistently on device.
Mir geht es darum, wenn ich später mal etwas feststelle, dass ein OS Funktioni oder App nicht fehlerfrei läuft, ich es aber gerade nicht reproduzieren kann, ich an evtl. generierte Logdaten herankommen möchte.
gruss
stefan

Antworten
  • Forum-Beiträge: 5

27.02.2018, 17:55:11 via Website

Sali Fabian,
danke für Antwort und 'tschuldigung für meine späte Antwort aber ich war die letzten Monate verreist.
Nun zu deiner Frage vorerst geht es mir um das auslesen von logs anderer Applikationen/Systeme, bevor es an evtl. eigene Applikationen geht.
Ich möchte die logs lokal im Android ansehen bzw. auch auf dem Desktop Rechner.
Am besten Liste ich mal meinen Wissensstand auf:

  1. Wie log Einträge generiert werden haben ich mittlerweile verstanden.
    Es ist rein die Applikation, die dies veranlasst, das ROM hat darauf
    keinen Einfluss, es sei denn es handelt sich um Systemfunktionen.
  2. Logger buffer sizes legt die Grösse des Ringspeichers der Log-Dateien fest.
  3. Meines Wissen gibt es nur diese Buffer
    a) main - the main application log
    b) events - for system event information
    c) radio - for radio and phone-related information
    d) system - a log for low-level system messages and debugging

Jetzt habe ich folgendes Problem. Mein Telefon springt manchmal nicht auf Mobile Daten über, wenn es das WLAN-Signal verliert.
Jetzt möchte ich ein Logcat-App starten, welche ein gewisse Zeit in die Vergangenheit zurück geht und alle Log-Einträge bis zum jetzigen Zeitpunkt exportiert.
Ich habe festgestellt, das jegliche App, ob mobil oder Desktop, bis auf mlogcat.tistory.com und github.com/plusCubed/matlog (aber Daten waren inkonsistent) nur Daten ab dem Zeitpunkt des Öffnen der Applikation sammelt.

Ein Idee wie ich da am besten Vorgehe?

Gruss

Stefan

p.s. gibt es Neues bzgl. Alternativen zu utilloggin, da bei Log4J für Android seit langem nichts mehr passiert ist.

Antworten

Empfohlene Artikel