По умолчанию создается впечатление, что logcat обрезает любое сообщение журнала, которое считает «слишком длинным». Это происходит как внутри Eclipse, так и при запуске logcat в командной строке с помощью adb -d logcat
и усечения некоторых важных отладочных сообщений.
Есть ли способ увеличить максимальную длину строки, поддерживаемую logcat, чтобы он прекратил усекать отладочную информацию? Официальная документация подразумевает , что не может быть, но , возможно , LogCat поддерживают некоторые дополнительные опции там не упоминаются?
Ответы:
В logcat есть буфер фиксированного размера для двоичных журналов (
/dev/log/events
), и этот предел составляет 1024 байта. Для недвоичных журналов также существует ограничение:Таким образом, реальный размер сообщения для двоичных и недвоичных журналов составляет ~ 4076 байт. Этот
LOGGER_ENTRY_MAX_PAYLOAD
предел накладывает интерфейс регистратора ядра .Источники liblog (используемые logcat) также говорят:
Я бы порекомендовал вам инструмент nxlog , который не использует двоичный файл logcat, но из-за ограничений ядра я сомневаюсь, что он решит вашу проблему. Тем не менее, попробовать стоит. (отказ от ответственности: я автор.)
источник
LOGGER_ENTRY_MAX_PAYLOAD
в более поздних версиях Android этот показатель был уменьшен с 4076 до 4068 (см. Здесь ).Хорошо, интересно. Я был разочарован, увидев, что ответ был «вы не можете его расширить». Моя первоначальная мысль заключалась в том, чтобы разбить его, чтобы я мог видеть все это, поэтому здесь я поделюсь с вами, как я это делаю (не то чтобы это было что-то необычное и почти неэффективное, но оно выполняет свою работу в крайнем случае):
Отредактировано, чтобы показать последнюю строку!
источник
int chunkCount = sb.length() / 4000;
Useint chunkCount = sb.length() / 4000; if (chunkCount * 4000 < sb.length()) chunkCount++;
else { Log.v(TAG, sb); }
чтобы также печатать журнал, когда сообщение имеет длину <= 4000 символовРекурсивно разбейте его на несколько частей.
источник
источник
Вот код, который я использую - он обрезает строки на пределе 4000, а также разбивает строку на новых строках, а не в середине строки. Облегчает чтение файла журнала.
Использование:
Реализация:
источник
Приведенный ниже код является уточнением того, что было опубликовано Марком Буйкема. Он разбивает строку на новые строки. Полезно для записи длинных строк JSON.
источник
источник
нам эта логика пейджинга
источник
предлагая свой собственный взгляд на решение Трэвиса,
Воспользуйтесь тем, что
Log.println()
возвращает количество записанных байтов, чтобы избежать жесткого кодирования «4000». затем рекурсивно назовите себя частью сообщения, которое невозможно зарегистрировать, пока ничего не останется.источник
Если ваш журнал очень длинный (например, ведется полный дамп вашей базы данных для отладки и т. Д.), Может случиться так, что logcat предотвратит чрезмерное ведение журнала. Чтобы обойти это, вы можете добавить таймаут каждые x миллисекунд.
Остерегайтесь, используйте это только для целей отладки, так как это может остановить основной поток.
источник
Как упоминал @mhsmith,
LOGGER_ENTRY_MAX_PAYLOAD
в последних версиях Android это 4068. Однако, если вы используете 4068 в качестве максимальной длины сообщения во фрагментах кода, предлагаемых в других ответах, сообщения будут усечены. Это связано с тем, что Android добавляет больше символов в начало и конец сообщения, что также учитывается. В других ответах в качестве обходного пути используется предел 4000. Однако с помощью этого кода можно действительно использовать весь лимит (код генерирует тег из трассировки стека, чтобы показать имя класса и номер строки, которая вызвала журнал, не стесняйтесь изменять это):источник
Я не знаю какой-либо опции для увеличения длины logcat, но мы можем найти различные журналы, такие как основной журнал, журнал событий и т. Д. Основной журнал обычно содержит все, что его длина достигает 4 Мб .. Так что вы можете получить то, что потеряли в терминале журнала. Путь: \ data \ logger.
источник
Хотя другие предоставленные решения были полезны, они меня не удовлетворили, потому что они не охватывали случаи, когда журнал длиннее, чем в два раза длиннее, чем LOGGER_ENTRY_MAX_LEN, упомянутый @ b0ti. Более того, даже мое следующее решение не идеально, поскольку LOGGER_ENTRY_MAX_LEN не извлекается динамически. Если кто-то знает, как это сделать, я хотел бы услышать об этом в комментариях! Во всяком случае, это решение, которое я использую в своем коде прямо сейчас:
источник