Як отримати файл реєстрації з пристрою Android?


129

Я хотів би перетягнути файл журналу з пристрою на свій ПК. Як я можу це зробити?

Відповіді:


112

Logcollector - хороший варіант, але спочатку його потрібно встановити.

Коли я хочу отримати лог-файл для надсилання поштою, я зазвичай виконую наступні дії:


Цей командний рядок для мене не працює, я отримую цей вихід. logcat прочитав: Недійсний аргумент
neoneye

5
зауважте, що logcollector не працює для версій Android вище 4.1, оскільки програмам тепер дозволено лише читати власні записи журналу. ( groups.google.com/forum/#!topic/android-log-collector/… )
Метью Лоу

11
Чи не існує простого методу, якимось способом просто витягнути файл журналу з пристрою, як тільки він підключений через USB як зовнішній запам'ятовуючий пристрій, без необхідності встановлювати adb чи щось подібне?
АБО Mapper

Переконайтеся, що ви знаходитесь у потрібному каталозі adb. Зазвичай вC:\Users\[your username]\AppData\Local\Android\Sdk\platform-tools\
lolololol ol

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" />

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.


1
Саме те, що я шукав!
YYamil

1
Де я його точно знаходжу?
gurehbgui

11

Редагувати:

Внутрішній журнал - це круговий буфер пам'яті. Насправді є кілька таких кругових буферів для кожного з: радіо, події, головне. За замовчуванням є основним.

Для отримання копії буфера одна техніка передбачає виконання команди на пристрої та отримання виводу у вигляді змінної рядка.

SendLog - це програма з відкритим кодом, яка робить саме це: http://www.l6n.org/android/sendlog.shtml

Ключ - це запустити logcatна пристрої вбудовану ОС. Це не так складно, як це звучить, просто перевірте додаток з відкритим кодом за посиланням.


Це скидає вихід на екран, мені це потрібно у файлі.
Pentium10

Ви можете надсилати журнали за допомогою aLogCat. Або просто скопіюйте-вставте з DDMS: P
монарм

@molnarm Я визнаю, що моя відповідь була трохи перероблена, якщо це все, що йому потрібно зробити =)
Бред Хайн

@BradHein Ви сказали, що SendLog був відкритим кодом, але я не можу знайти вихідний код. Будь-яка ідея, де це?
smith324

8

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

Мені так подобається:

prompt> cd ~/Desktop
prompt> adb logcat -c
prompt> adb logcat | tee log.txt

Дякую! У мене була помилка давно, що logcat -c виправила її негайно!
Джордс

4

Простий спосіб - зробити власні способи збирання журналів або навіть просто існуючий додаток для збирання журналів з ринку.

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

Ось простий приклад того, як отримати файл журналу з пристрою:



3

Я знаю, що це давнє питання, але я вважаю, що все ще діє навіть у 2018 році.

Існує можливість взяти звіт про помилки, прихований у параметрах розробника на кожному пристрої Android.

ПРИМІТКА. Це скидає весь системний журнал

Як увімкнути параметри розробника? дивіться: https://developer.android.com/studio/debug/dev-options

Що для мене працює:

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

як це читати? відкритий 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

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){}

де найкраще розмістити цей код? в OnCreate?
Youngjae

2

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

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

Я сподіваюся, що це може допомогти.


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:

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

потім запустіть:

adb shell logcat > log.txt

АБО спочатку перейдіть до платформи-інструментів adb:

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

потім біжи

./adb shell logcat > log.txt
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.