Android
Loggen en Logcat gebruiken
Zoeken…
Syntaxis
-
Log.v(String tag, String msg, Throwable tr)
-
Log.v(String tag, String msg)
-
Log.d(String tag, String msg, Throwable tr)
-
Log.d(String tag, String msg)
-
Log.i(String tag, String msg, Throwable tr)
-
Log.i(String tag, String msg)
-
Log.w(String tag, String msg, Throwable tr)
-
Log.w(String tag, String msg)
-
Log.e(String tag, String msg, Throwable tr)
-
Log.e(String tag, String msg)
parameters
Optie | Beschrijving |
---|---|
-b (buffer) | Laadt een alternatieve logbuffer voor weergave, zoals evenementen of radio. De hoofdbuffer wordt standaard gebruikt. Zie Alternatieve logbuffers bekijken. |
-C | Wist (spoelt) het hele logboek en wordt afgesloten. |
-d | Dumpt het logboek naar het scherm en wordt afgesloten. |
-f (bestandsnaam) | Schrijft uitvoer van logboekberichten naar (bestandsnaam). De standaardwaarde is stdout. |
-g | Drukt de grootte van de opgegeven logbuffer af en wordt afgesloten. |
-n (tellen) | Stelt het maximale aantal geroteerde logboeken in op (aantal). De standaardwaarde is 4. Vereist de optie -r. |
-r (kbytes) | Roteert het logbestand elke (kbytes) uitvoer. De standaardwaarde is 16. Vereist de optie -f. |
-s | Stelt de standaard filterspecificatie in op stil. |
-v (indeling) | Stelt het uitvoerformaat in voor logberichten. De standaardinstelling is kort. |
Opmerkingen
Definitie
Logcat is een opdrachtregelprogramma dat een logboek van systeemberichten dumpt, inclusief stapelsporen wanneer het apparaat een fout genereert en berichten die u vanuit uw app met de klasse Log hebt geschreven.
Wanneer te gebruiken
Als u overweegt om de System.out-methoden van Java te gebruiken om naar de console af te drukken in plaats van een van de Log-methoden van Android, dan moet u weten dat ze in principe hetzelfde werken. Het is echter beter om het gebruik van Java's methoden te vermijden, omdat de extra informatie en opmaak van de Log-methoden van Android voordeliger zijn. De afdrukmethoden van System.out worden ook omgeleid naar de methode Log.i()
.
Handige links
- Android-ontwikkelaar officiële documentatie voor Log en logcat .
- Stackoveflow Vraag: Android Log.v (), Log.d (), Log.i (), Log.w (), Log.e () - Wanneer elke te gebruiken?
De logcat-uitvoer filteren
Het is handig om de logcat-uitvoer te filteren omdat er veel berichten zijn die niet interessant zijn. Om de uitvoer te filteren, opent u de "Android Monitor" en klikt u op de vervolgkeuzelijst rechtsboven en selecteert u Filterconfiguratie bewerken
U kunt nu aangepaste filters toevoegen om interessante berichten weer te geven, evenals bekende logregels die veilig kunnen worden genegeerd. Als u een deel van de uitvoer wilt negeren, kunt u een reguliere expressie definiëren. Hier is een voorbeeld van het uitsluiten van overeenkomende tags:
^(?!(HideMe|AndThis))
Dit kan worden ingevoerd door dit voorbeeld te volgen:
Het bovenstaande is een reguliere expressie die invoer uitsluit. Als u nog een tag aan de zwarte lijst wilt toevoegen, voegt u deze toe na een pipe |
karakter. Als u bijvoorbeeld "GC" op de zwarte lijst wilt plaatsen, zou u een filter als deze gebruiken:
^(?!(HideMe|AndThis|GC))
Ga voor meer documentatie en voorbeelden naar Loggen en Logcat gebruiken
logging
Elke Android-applicatie van goede kwaliteit houdt bij wat het doet via applicatielogboeken. Met deze logboeken kan de ontwikkelaar eenvoudig de fout opsporen om te diagnosticeren wat er aan de hand is met de toepassing. Volledige Android documentatie kan worden gevonden hier , maar een samenvatting volgt:
Basisregistratie
De klasseLog
is de belangrijkste bron voor het schrijven van ontwikkelaarslogboeken door een tag
en een message
. Met de tag kunt u logboekberichten filteren op welke lijnen uit uw specifieke activiteit komen. Gewoon bellen Log.v(String tag, String msg);
En het Android-systeem schrijft een bericht naar de logcat:
07-28 12:00:00.759 24812-24839/my.packagename V/MyAnimator: Some log messages
└ time stamp | app.package┘ | └ any tag |
process & thread ids ┘ log level┘ └ the log message
TIP:
Let op het proces-ID en de thread-ID. Als ze hetzelfde zijn, komt het logboek uit de hoofdthread / UI-thread!
Elke tag kan worden gebruikt, maar het is gebruikelijk om de klassenaam als tag te gebruiken:
public static final String tag = MyAnimator.class.getSimpleName();
Logniveaus
De Android-logger heeft 6 verschillende niveaus, die elk een bepaald doel dienen:-
ERROR
:Log.e()
- Wordt gebruikt om kritieke fouten aan te geven, dit is het niveau waarop wordt afgedrukt bij het genereren van een
Exception
.
- Wordt gebruikt om kritieke fouten aan te geven, dit is het niveau waarop wordt afgedrukt bij het genereren van een
-
WARN
:Log.w()
- Wordt gebruikt om een waarschuwing aan te geven, voornamelijk voor herstelbare storingen
-
INFO
:Log.i()
- Wordt gebruikt om informatie op een hoger niveau aan te geven over de status van de toepassing
-
DEBUG
:Log.d()
- Wordt gebruikt om informatie vast te leggen die nuttig zou zijn om te weten wanneer u de foutopsporing in de toepassing opheft, maar die in de weg zou kunnen staan bij het uitvoeren van de toepassing
-
VERBOSE
:Log.v()
- Wordt gebruikt om informatie te loggen die de kleine details over de status van de applicatie weergeeft
-
ASSERT
:Log.wtf()
- Wordt gebruikt om informatie vast te leggen over een toestand die nooit zou mogen voorkomen.
- wtf staat voor "What a Terrible Failure".
Motivatie voor logboekregistratie
De motivatie voor logboekregistratie is om eenvoudig fouten, waarschuwingen en andere informatie te vinden door de reeks gebeurtenissen van de toepassing te bekijken. Stel je bijvoorbeeld een toepassing voor die regels uit een tekstbestand leest, maar er ten onrechte van uitgaat dat het bestand nooit leeg zal zijn. De logtracering (van een app die niet logt) ziet er ongeveer zo uit:E/MyApplication: Process: com.example.myapplication, PID: 25788
com.example.SomeRandomException: Expected string, got 'null' instead
Gevolgd door een stapel stacksporen die uiteindelijk zouden leiden tot de overtredende lijn, waar doorgaan met een debugger uiteindelijk tot het probleem zou leiden
De logtracering van een toepassing waarvoor logboekregistratie is ingeschakeld, kan er echter ongeveer zo uitzien:
V/MyApplication: Looking for file myFile.txt on the SD card
D/MyApplication: Found file myFile.txt at path <path>
V/MyApplication: Opening file myFile.txt
D/MyApplication: Finished reading myFile.txt, found 0 lines
V/MyApplication: Closing file myFile.txt
...
E/MyApplication: Process: com.example.myapplication, PID: 25788
com.example.SomeRandomException: Expected string, got 'null' instead
Een snelle blik op de logs en het is duidelijk dat het bestand leeg was.
Overwegingen bij het loggen:
Hoewel logboekregistratie een krachtig hulpmiddel is waarmee Android-ontwikkelaars meer inzicht kunnen krijgen in de interne werking van hun applicatie, heeft logregistratie wel een aantal nadelen.Log leesbaarheid:
Het is gebruikelijk dat Android-applicaties meerdere logboeken synchroon hebben. Als zodanig is het erg belangrijk dat elk logboek gemakkelijk leesbaar is en alleen relevante, noodzakelijke informatie bevat.Prestatie:
Loggen vereist een kleine hoeveelheid systeembronnen. Over het algemeen is dit geen reden tot bezorgdheid, maar als ze te veel worden gebruikt, kan logboekregistratie een negatieve invloed hebben op de prestaties van de toepassing.Veiligheid:
Onlangs zijn verschillende Android-applicaties toegevoegd aan de Google Play-marktplaats waarmee de gebruiker logboeken van alle actieve applicaties kan bekijken. Door deze onbedoelde weergave van gegevens kunnen gebruikers mogelijk vertrouwelijke informatie bekijken. Verwijder als vuistregel altijd logboeken met niet-openbare gegevens voordat u uw toepassing op de markt publiceert.Conclusie:
Logboekregistratie is een essentieel onderdeel van een Android-applicatie, vanwege de kracht die het geeft aan ontwikkelaars. De mogelijkheid om een nuttige logtracering te maken is een van de meest uitdagende aspecten van softwareontwikkeling, maar de Log-klasse van Android helpt het veel gemakkelijker te maken.Ga voor meer documentatie en voorbeelden naar Loggen en Logcat gebruiken
Log met link naar bron direct vanuit Logcat
Dit is een leuke truc om een link naar code toe te voegen, dus het zal gemakkelijk zijn om naar de code te springen die het logboek heeft uitgegeven.
Met de volgende code, deze oproep:
MyLogger.logWithLink("MyTag","param="+param);
Zal resulteren in:
07-26...012/com.myapp D/MyTag: MyFrag:onStart(param=3) (MyFrag.java:2366) // << logcat converts this to a link to source!
Dit is de code (binnen een klasse met de naam MyLogger):
static StringBuilder sb0 = new StringBuilder(); // reusable string object
public static void logWithLink(String TAG, Object param) {
StackTraceElement stack = Thread.currentThread().getStackTrace()[3];
sb0.setLength(0);
String c = stack.getFileName().substring(0, stack.getFileName().length() - 5); // removes the ".java"
sb0.append(c).append(":");
sb0.append(stack.getMethodName()).append('(');
if (param != null) {
sb0.append(param);
}
sb0.append(") ");
sb0.append(" (").append(stack.getFileName()).append(':').append(stack.getLineNumber()).append(')');
Log.d(TAG, sb0.toString());
}
Dit is een eenvoudig voorbeeld, het kan eenvoudig worden uitgebreid om een link naar de beller te geven (hint: de stapel is [4] in plaats van [3]) en u kunt ook andere relevante informatie toevoegen.
De Logcat gebruiken
Logcat is een opdrachtregelprogramma dat een logboek van systeemberichten dumpt, inclusief stapelsporen wanneer het apparaat een fout genereert en berichten die u vanuit uw app met de klasse Log hebt geschreven.
De Logcat-uitvoer kan worden weergegeven in Android Monitor van Android Studio of met een adb-opdrachtregel.
In Android Studio
Weergeven door te klikken op het pictogram "Android Monitor": Of door op Alt + 6 te drukken op Windows / Linux of CMD + 6 op Mac.
via opdrachtregel:
Eenvoudig gebruik:
$ adb logcat
Met tijdstempels:
$ adb logcat -v time
Filter op specifieke tekst:
$ adb logcat -v time | grep 'searchtext'
Er zijn veel opties en filters beschikbaar voor opdrachtregellogcat , hier gedocumenteerd.
Een eenvoudig maar nuttig voorbeeld is de volgende filterexpressie die alle logboekberichten met prioriteitsniveau "error" op alle tags weergeeft:
$ adb logcat *:E
Logboekcode genereren
Android Studio
Live templates
Android Studio
kunnen nogal wat snelkoppelingen bieden om snel in te loggen.
Als u Live-sjablonen wilt gebruiken, hoeft u alleen maar de sjabloonnaam te typen en op TAB
of Enter te drukken om de instructie in te voegen.
Voorbeelden:
-
logi
→ wordt →android.util.Log.i(TAG, "$METHOD_NAME$: $content$");
-
$METHOD_NAME$
wordt automatisch vervangen door de naam van uw methode en de cursor wacht tot de inhoud is gevuld.
-
-
loge
→ hetzelfde, voor fouten - etc. voor de rest van de logniveaus.
Een volledige lijst met sjablonen is te vinden in de instellingen van Android Studio
( ALT + s en type "live"). En het is mogelijk om ook uw aangepaste sjablonen toe te voegen.
Als u de Live templates
Android Studio
niet genoeg vindt voor uw behoeften, kunt u de Android Postfix-plug-in overwegen
Dit is een zeer nuttige bibliotheek die u helpt voorkomen dat u de logboekregel handmatig hoeft te schrijven.
De syntaxis is absoluut eenvoudig:
.log - Logboekregistratie. Als er constante variabele "TAG" is, gebruikt deze "TAG". Anders gebruikt u de klassenaam.
Gebruik van Android Studio
Logboeken wissen
Om het hele logboek te wissen (doorspoelen):
adb logcat -c