Standardmäßig scheint logcat jede Protokollnachricht abzuschneiden, die als "zu lang" eingestuft wird. Dies geschieht sowohl innerhalb von Eclipse als auch beim Ausführen von logcat in der Befehlszeile mit adb -d logcat
und schneidet einige wichtige Debugging-Meldungen ab.
Gibt es eine Möglichkeit, die von logcat unterstützte maximale Zeichenfolgenlänge zu erhöhen, damit die Debug-Informationen nicht mehr abgeschnitten werden? Die offizielle Dokumentation impliziert, dass dies möglicherweise nicht der Fall ist, aber möglicherweise unterstützt logcat einige zusätzliche Optionen, die dort nicht erwähnt werden.
Antworten:
In logcat gibt es einen Puffer mit fester Größe für binäre Protokolle (
/dev/log/events
), und diese Grenze liegt bei 1024 Byte. Für die nicht-binären Protokolle gibt es auch eine Grenze:Die tatsächliche Nachrichtengröße für binäre und nicht-binäre Protokolle beträgt also ~ 4076 Byte. Die Kernel-Logger-Schnittstelle legt diese
LOGGER_ENTRY_MAX_PAYLOAD
Grenze fest.Die Liblog-Quellen (von logcat verwendet) sagen auch:
Ich würde Ihnen das nxlog- Tool empfehlen , das nicht die logcat-Binärdatei verwendet, aber aufgrund der Einschränkungen im Kernel bezweifle ich, dass es Ihr Problem lösen wird. Trotzdem könnte es einen Versuch wert sein. (Haftungsausschluss: Ich bin der Autor.)
quelle
LOGGER_ENTRY_MAX_PAYLOAD
in neueren Android-Versionen von 4076 auf 4068 reduziert (siehe hier ).Ok, interessant. Ich war enttäuscht zu sehen, dass die Antwort "Sie können es nicht wirklich erweitern" war. Mein erster Gedanke war, es aufzubrechen, damit ich das Ganze sehen kann. Hier teile ich Ihnen mit, wie ich genau das mache (nicht, dass es etwas Besonderes ist oder nahezu effizient, aber es erledigt die Arbeit zur Not):
Bearbeitet, um die letzte Zeichenfolge anzuzeigen!
quelle
int chunkCount = sb.length() / 4000;
Useint chunkCount = sb.length() / 4000; if (chunkCount * 4000 < sb.length()) chunkCount++;
else { Log.v(TAG, sb); }
um auch das Protokoll zu drucken, wenn die Nachricht <= 4000 Zeichen lang istBrechen Sie es rekursiv in mehrere Teile auf.
quelle
quelle
Hier ist der Code, den ich verwende - er schneidet die Zeilen an der Grenze von 4000 ab und unterbricht die Zeile auch bei neuen Zeilen und nicht in der Mitte der Zeile. Erleichtert das Lesen der Protokolldatei.
Verwendung:
Implementierung:
quelle
Der folgende Code ist eine Verfeinerung dessen, was von Mark Buikema gepostet wurde. Es bricht die Zeichenfolge bei neuen Zeilen. Nützlich zum Protokollieren langer JSON-Zeichenfolgen.
quelle
quelle
uns diese Paging-Logik
quelle
Bereitstellung meiner eigenen Sicht auf Travis 'Lösung,
Nutzen Sie die Tatsache, dass
Log.println()
die Anzahl der geschriebenen Bytes zurückgegeben wird, um eine Hardcodierung von "4000" zu vermeiden. Rufen Sie sich dann rekursiv bei dem Teil der Nachricht an, der erst protokolliert werden konnte, wenn nichts mehr übrig ist.quelle
Wenn Ihr Protokoll sehr lang ist (z. B. Protokollierung des gesamten Speicherauszugs Ihrer Datenbank aus Debugging-Gründen usw.), kann es vorkommen, dass logcat eine übermäßige Protokollierung verhindert. Um dies zu umgehen, können Sie alle x Millisekunden eine Zeitüberschreitung hinzufügen.
Beachten Sie, dass Sie dies nur zum Debuggen verwenden, da dadurch der Hauptthread des Blocks angehalten werden kann.
quelle
Wie @mhsmith erwähnte,
LOGGER_ENTRY_MAX_PAYLOAD
ist das in den letzten Android-Versionen 4068. Wenn Sie jedoch 4068 als maximale Nachrichtenlänge in den in anderen Antworten angebotenen Codefragmenten verwenden, werden die Nachrichten abgeschnitten. Dies liegt daran, dass Android am Anfang und am Ende Ihrer Nachricht weitere Zeichen hinzufügt, die ebenfalls zählen. Andere Antworten verwenden das Limit von 4000 als Problemumgehung. Es ist jedoch möglich, das gesamte Limit mit diesem Code wirklich zu nutzen (der Code generiert ein Tag aus dem Stack-Trace, um den Klassennamen und die Zeilennummer anzuzeigen, die das Protokoll aufgerufen haben. Sie können dies jederzeit ändern):quelle
Ich kenne keine Option, um die Länge von logcat zu erhöhen, aber wir können die verschiedenen Protokolle wie Hauptprotokoll, Ereignisprotokoll usw. finden. Das Hauptprotokoll enthält normalerweise alles, was seine Länge bis zu 4 MB beträgt. So können Sie möglicherweise das bekommen, was Sie verloren haben im Protokollterminal. Der Pfad lautet: \ data \ logger.
quelle
Obwohl die anderen bereitgestellten Lösungen hilfreich waren, war ich mit ihnen nicht zufrieden, da sie keine Fälle abdeckten, in denen das Protokoll länger als doppelt so lang ist wie das von @ b0ti erwähnte LOGGER_ENTRY_MAX_LEN. Darüber hinaus ist auch meine folgende Lösung nicht perfekt, da LOGGER_ENTRY_MAX_LEN nicht dynamisch abgerufen wird. Wenn jemand einen Weg kennt, dies zu tun, würde ich gerne in den Kommentaren davon hören! Auf jeden Fall ist dies die Lösung, die ich gerade in meinem Code verwende:
quelle