Как получить файл журнала с устройства Android? - PullRequest
118 голосов
/ 21 мая 2010

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

Ответы [ 13 ]

105 голосов
/ 22 мая 2010

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

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

28 голосов
/ 04 марта 2014

Надеюсь, этот код кому-нибудь поможет. У меня ушло 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" />
24 голосов
/ 30 сентября 2012

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

$adb logcat -d > logcat.txt

Опция -d сбрасывает весь циклический буфер в текстовый файл, и если вы ищете конкретное действие / намерение, попробуйте

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

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

12 голосов
/ 26 мая 2016

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

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

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

10 голосов
/ 21 мая 2010

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

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

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

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

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

8 голосов
/ 24 августа 2011

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

Мне так нравится:

prompt> cd ~/Desktop
prompt> adb logcat -c
prompt> adb logcat | tee log.txt
4 голосов
/ 21 мая 2010

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

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

Вот простой пример получения файла журнала с устройства:

3 голосов
/ 21 июня 2018

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

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

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

.

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

Что работает для меня:

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

как это прочитать? open bugreport-1960-01-01-hh-mm-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
3 голосов
/ 28 апреля 2016

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

adb shell logcat
2 голосов
/ 14 декабря 2016

Два шага:

  • Создание журнала
  • Загрузка 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 за правильно работающий ответ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...