Как получить файл журнала с устройства Android?

130

Я хотел бы загрузить файл журнала с устройства на свой компьютер. Как я могу это сделать?

Pentium10
источник

Ответы:

113

Logcollector - хороший вариант, но сначала вам нужно установить его.

Когда я хочу получить файл журнала для отправки по почте, я обычно делаю следующее:

Macarse
источник
Эта командная строка у меня не работает, я получаю такой результат. logcat прочитал: Недействительный аргумент
neoneye
5
обратите внимание, что logcollector не работает для версий Android выше 4.1, потому что приложениям теперь разрешено читать только свои собственные записи журнала. ( groups.google.com/forum/#!topic/android-log-collector/… )
Мэтью Лоу
11
Нет ли какого-либо простого метода, способа просто вытащить файл журнала с устройства, когда оно подключено через USB в качестве внешнего запоминающего устройства, без необходимости устанавливать adb или что- то в этом роде ?
OR Mapper
Убедитесь, что вы находитесь в правильном каталоге для запуска adb. Обычно вC:\Users\[your username]\AppData\Local\Android\Sdk\platform-tools\
лолололол ол
30

Надеюсь, этот код кому-то поможет. Мне потребовалось 2 дня, чтобы понять, как войти с устройства, а затем отфильтровать его:

public File extractLogToFileAndWeb(){
        //set a file
        Date datum = new Date();
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd", Locale.ITALY);
        String fullName = df.format(datum)+"appLog.log";
        File file = new File (Environment.getExternalStorageDirectory(), fullName);

        //clears a file
        if(file.exists()){
            file.delete();
        }


        //write log to file
        int pid = android.os.Process.myPid();
        try {
            String command = String.format("logcat -d -v threadtime *:*");        
            Process process = Runtime.getRuntime().exec(command);

            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            StringBuilder result = new StringBuilder();
            String currentLine = null;

            while ((currentLine = reader.readLine()) != null) {
                   if (currentLine != null && currentLine.contains(String.valueOf(pid))) {
                       result.append(currentLine);
                       result.append("\n");
                    }
            }

            FileWriter out = new FileWriter(file);
            out.write(result.toString());
            out.close();

            //Runtime.getRuntime().exec("logcat -d -v time -f "+file.getAbsolutePath());
        } catch (IOException e) {
            Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_SHORT).show();
        }


        //clear the log
        try {
            Runtime.getRuntime().exec("logcat -c");
        } catch (IOException e) {
            Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_SHORT).show();
        }

        return file;
    }

как указано @mehdok

добавить в манифест разрешение на чтение логов

<uses-permission android:name="android.permission.READ_LOGS" />
user1354692
источник
1
это работает нормально, но работает на всех устройствах, которые вам нужны<uses-permission android:name="android.permission.READ_LOGS" />
mehdok
27

Я бы использовал что-то в этом роде:

$adb logcat -d > logcat.txt

Параметр -d выгружает весь круговой буфер в текстовый файл, и если вы ищете конкретное действие / намерение, попробуйте

$adb logcat -d | grep 'com.whatever.you.are.looking.for' -B 100 -A 100 > shorterlog.txt

Надеюсь это поможет :)

Рохит
источник
13

Для тех, кто не интересуется отладкой или использованием USB, adbесть более простое решение. В Android 6 (не уверен в предыдущей версии) в инструментах разработчика есть опция: Take Bug Report

При выборе этой опции будет подготовлен отчет об ошибке с предложением сохранить его на диске или отправить по электронной почте.

Я обнаружил, что это самый простой способ получить журналы. Не люблю включать отладку по USB.

jjhavokk
источник
1
Именно то, что я искал!
YYamil 05
1
Где я его точно найду?
gurehbgui
11

РЕДАКТИРОВАТЬ:

Внутренний журнал - это кольцевой буфер в памяти. На самом деле существует несколько таких кольцевых буферов для каждого из: radio, events, main. По умолчанию - main.

Чтобы получить копию буфера, один из способов включает выполнение команды на устройстве и получение вывода в виде строковой переменной.

SendLog - это приложение с открытым исходным кодом, которое делает именно это: http://www.l6n.org/android/sendlog.shtml

Ключ к запуску logcatна устройстве во встроенной ОС. Это не так сложно, как кажется, просто посмотрите приложение с открытым исходным кодом по ссылке.

Брэд Хайн
источник
Это выводит вывод на экран, он мне нужен в файле.
Pentium10
Вы можете отправлять журналы с помощью aLogCat. Или просто скопируйте из DDMS: P
molnarm
@molnarm Я признаю, что мой ответ был немного перестроен, если это все, что ему нужно сделать =)
Брэд Хайн
@BradHein Вы сказали, что SendLog имеет открытый исходный код, но я не могу найти исходный код. Есть идеи, где это?
smith324
8

Часто получаю ошибку " logcat read: Invalid argument". Мне пришлось очистить журнал перед чтением из журнала.

Мне это нравится:

prompt> cd ~/Desktop
prompt> adb logcat -c
prompt> adb logcat | tee log.txt
neoneye
источник
Спасибо! У меня была эта ошибка в течение долгого времени, этот logcat -c немедленно исправил ее!
Jords
4

Простой способ - создать свои собственные методы сборщика журналов или даже просто существующее приложение для сборщика журналов с рынка.

Для своих приложений я сделал функцию отчета, которая отправляет журналы на мою электронную почту (или даже в другое место - как только вы получите журнал, вы можете делать с ним, как хотите).

Вот простой пример того, как получить файл журнала с устройства:

Мох
источник
3

Просто выполните следующую команду, чтобы получить вывод на свой терминал:

adb shell logcat
Вестон Гэнджер
источник
3

Я знаю, что это старый вопрос, но я считаю, что он остается актуальным даже в 2018 году.

Существует возможность создать отчет об ошибке, скрытый в параметрах разработчика на каждом устройстве Android.

ПРИМЕЧАНИЕ. Это приведет к сбросу всего системного журнала.

Как включить параметры разработчика? см. https://developer.android.com/studio/debug/dev-options

Что мне подходит:

  1. Перезагрузите устройство (чтобы создать минимум журналов мусора для анализа разработчиком)
  2. Воспроизведите свою ошибку
  3. Зайдите в Настройки -> Параметры разработчика -> Сделать отчет об ошибке.
  4. Подождите, пока система Android соберет журналы (следите за индикатором выполнения в уведомлении)
  5. По завершении нажмите на уведомление, чтобы поделиться им (вы можете использовать Gmail или что-то еще)

как это читать? открыть bugreport-1960-01-01-чч-мм-ss.txt

вы, вероятно, захотите найти что-то вроде этого:

------ SYSTEM LOG (logcat -v threadtime -v printable -d *:v) ------
--------- beginning of crash
06-13 14:37:36.542 19294 19294 E AndroidRuntime: FATAL EXCEPTION: main

или:

------ SYSTEM LOG (logcat -v threadtime -v printable -d *:v) ------
--------- beginning of main
Петр З
источник
2

Благодаря user1354692 я смог сделать это проще, используя только одну строку! тот, который он прокомментировал:

try {
    File file = new File(Environment.getExternalStorageDirectory(), String.valueOf(System.currentTimeMillis()));
    Runtime.getRuntime().exec("logcat -d -v time -f " + file.getAbsolutePath());}catch (IOException e){}
jfcogato
источник
где лучше всего разместить этот код? в OnCreate?
Ёнджэ
2

Я создал небольшую библиотеку (.aar) для получения журналов по электронной почте. Вы можете использовать его с учетными записями Gmail. Это довольно просто, но работает. Вы можете получить копию здесь

Сайт на испанском языке, но есть PDF-файл с английской версией описания продукта.

Надеюсь, это поможет.

lm2a
источник
2

Два шага:

  • Создать журнал
  • Загрузите Gmail, чтобы отправить журнал

,

  1. Создать журнал

    File generateLog() {
        File logFolder = new File(Environment.getExternalStorageDirectory(), "MyFolder");
        if (!logFolder.exists()) {
            logFolder.mkdir();
        }
        String filename = "myapp_log_" + new Date().getTime() + ".log";
    
        File logFile = new File(logFolder, filename);
    
        try {
            String[] cmd = new String[] { "logcat", "-f", logFile.getAbsolutePath(), "-v", "time", "ActivityManager:W", "myapp:D" };
            Runtime.getRuntime().exec(cmd);
            Toaster.shortDebug("Log generated to: " + filename);
            return logFile;
        }
        catch (IOException ioEx) {
            ioEx.printStackTrace();
        }
    
        return null;
    }
  2. Загрузите Gmail, чтобы отправить журнал

    File logFile = generateLog();
    Intent intent = new Intent(Intent.ACTION_SEND);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(logFile));
    intent.setType("multipart/");
    startActivity(intent);

Ссылки для # 1

~~

Для №2 - есть много разных ответов о том, как загрузить файл журнала для просмотра и отправки. Наконец, решение здесь действительно работало с обоими:

  • загрузить Gmail как вариант
  • успешно прикрепляет файл

Большое спасибо https://stackoverflow.com/a/22367055/2162226 за правильно рабочий ответ

Джин Бо
источник
0

Сначала убедитесь, что команда adb выполняется, установив PATH для android sdk platform-tools:

export PATH=/Users/espireinfolabs/Desktop/soft/android-sdk-mac_x86/platform-tools:$PATH

затем запустите:

adb shell logcat > log.txt

ИЛИ сначала перейдите к adb platform-tools:

cd /Users/user/Android/Tools/android-sdk-macosx/platform-tools 

затем беги

./adb shell logcat > log.txt
Акиб Мумтаз
источник