Jak uzyskać plik dziennika z urządzenia z systemem Android?

131

Chciałbym pobrać plik dziennika z urządzenia na komputer. Jak mogę to zrobić?

Pentium10
źródło

Odpowiedzi:

116

Logcollector to dobra opcja, ale najpierw musisz go zainstalować.

Kiedy chcę otrzymać plik dziennika do wysłania pocztą, zwykle wykonuję następujące czynności:

Macarse
źródło
Ten wiersz poleceń nie działa dla mnie, otrzymuję ten wynik. odczyt logcat: Nieprawidłowy argument
neoneye
5
pamiętaj, że logcollector nie działa dla wersji Androida powyżej 4.1, ponieważ aplikacje mogą teraz odczytywać tylko własne wpisy dziennika. ( groups.google.com/forum/#!topic/android-log-collector/… )
Matthew Lowe
11
Czy nie ma prostej metody, jakiegoś sposobu, aby po prostu pobrać plik dziennika z urządzenia po podłączeniu go przez USB jako zewnętrzne urządzenie magazynujące, bez konieczności instalowania adb lub czegoś podobnego?
LUB Mapper
Upewnij się, że jesteś w odpowiednim katalogu do uruchomienia adb. Zwykle wC:\Users\[your username]\AppData\Local\Android\Sdk\platform-tools\
lolololol ol
30

Mam nadzieję, że ten kod komuś pomoże. Zajęło mi 2 dni, aby dowiedzieć się, jak zalogować się z urządzenia, a następnie przefiltrować:

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;
    }

jak wskazał @mehdok

dodaj do manifestu uprawnienia do odczytu dzienników

<uses-permission android:name="android.permission.READ_LOGS" />
user1354692
źródło
1
to działa dobrze, ale działa na każdym urządzeniu, którego potrzebujesz<uses-permission android:name="android.permission.READ_LOGS" />
mehdok
27

Użyłbym czegoś takiego:

$adb logcat -d > logcat.txt

Opcja -d zrzuca cały cykliczny bufor do pliku tekstowego i jeśli szukasz określonej akcji / zamiaru, spróbuj

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

Mam nadzieję że to pomoże :)

Rohit
źródło
14

Dla tych, którzy nie są zainteresowani debugowaniem USB lub używaniem, adbistnieje łatwiejsze rozwiązanie. W Androidzie 6 (Nie jestem pewien co do poprzedniej wersji) w narzędziach programistycznych dostępna jest opcja: Take Bug Report

Kliknięcie tej opcji przygotuje raport o błędzie i poprosi o zapisanie go do jazdy lub wysłanie e-mailem.

Okazało się, że to najłatwiejszy sposób na uzyskanie dzienników. Nie lubię włączać debugowania USB.

jjhavokk
źródło
1
Dokładnie to, czego szukałem!
YYamil
1
Gdzie dokładnie to znajdę?
gurehbgui
11

EDYTOWAĆ:

Dziennik wewnętrzny to cykliczny bufor w pamięci. Takich buforów cyklicznych jest właściwie kilka dla każdego z nich: radio, zdarzenia, main. Wartość domyślna to main.

Aby uzyskać kopię bufora, jedna technika polega na wykonaniu polecenia na urządzeniu i uzyskaniu wyniku w postaci zmiennej łańcuchowej.

SendLog to aplikacja typu open source, która robi właśnie to: http://www.l6n.org/android/sendlog.shtml

Kluczem jest uruchomienie logcatna urządzeniu z wbudowanym systemem operacyjnym. To nie jest tak trudne, jak się wydaje, po prostu sprawdź aplikację open source w linku.

Brad Hein
źródło
To zrzuca dane wyjściowe na ekran, potrzebuję go w pliku.
Pentium10
Możesz wysyłać logi za pomocą aLogCat. Lub po prostu skopiuj i wklej z DDMS: P
molnarm
@molnarm Przyznaję, że moja odpowiedź była nieco przesadzona, jeśli to wszystko, co musi zrobić =)
Brad Hein
@BradHein Powiedziałeś, że SendLog jest open source, ale nie mogę znaleźć kodu źródłowego. Masz jakiś pomysł, gdzie to jest?
smith324
8

Często pojawia się błąd „ logcat read: Invalid argument”. Musiałem wyczyścić dziennik przed odczytaniem z niego.

Lubię to:

prompt> cd ~/Desktop
prompt> adb logcat -c
prompt> adb logcat | tee log.txt
neoneye
źródło
Dzięki! Miałem ten błąd przez długi czas, ten logcat -c naprawił go natychmiast!
Jords
4

Prostym sposobem jest utworzenie własnych metod modułu zbierającego dzienniki lub nawet istniejącej aplikacji do gromadzenia dzienników z rynku.

Dla moich aplikacji stworzyłem funkcję raportowania, która wysyła dzienniki na mój e-mail (lub nawet w inne miejsce - po otrzymaniu dziennika możesz to zrobić, czy chcesz).

Oto prosty przykład, jak pobrać plik dziennika z urządzenia:

Mech
źródło
4

Wiem, że to stare pytanie, ale uważam, że nadal aktualne nawet w 2018 roku.

Istnieje możliwość zrobienia raportu o błędzie ukrytego w opcjach programisty na każdym urządzeniu z Androidem.

UWAGA: Spowoduje to zrzucenie całego dziennika systemowego

Jak włączyć opcje programistyczne? zobacz: https://developer.android.com/studio/debug/dev-options

Co mi pasuje:

  1. Uruchom ponownie urządzenie (w celu utworzenia minimalnych dzienników śmieci do analizy przez programistę)
  2. Odtwórz swój błąd
  3. Przejdź do Ustawienia -> Opcje programisty -> Zgłoś błąd
  4. Poczekaj, aż system Android zbierze dzienniki (obserwuj pasek postępu w powiadomieniu)
  5. Po zakończeniu stuknij powiadomienie, aby je udostępnić (możesz użyć Gmaila lub gdziekolwiek indziej)

jak to czytać? otwórz bugreport-1960-01-01-hh-mm-ss.txt

prawdopodobnie chcesz poszukać czegoś takiego:

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

lub:

------ SYSTEM LOG (logcat -v threadtime -v printable -d *:v) ------
--------- beginning of main
Piotr Z
źródło
3

Po prostu uruchom następujące polecenie, aby uzyskać dane wyjściowe na terminalu:

adb shell logcat
Weston Ganger
źródło
2

Dzięki user1354692 mogłem to ułatwić, mając tylko jedną linię! ten, który skomentował:

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
źródło
gdzie najlepiej umieścić ten kod? w OnCreate?
Youngjae
2

Utworzyłem małą bibliotekę (.aar) do pobierania dzienników pocztą elektroniczną. Możesz go używać z kontami Gmail. To całkiem proste, ale działa. Możesz otrzymać kopię stąd

Strona jest w języku hiszpańskim, ale dostępny jest plik PDF z angielską wersją opisu produktu.

Mam nadzieję, że to pomoże.

lm2a
źródło
2

Dwa kroki:

  • Wygeneruj dziennik
  • Załaduj Gmaila, aby wysłać dziennik

.

  1. Wygeneruj dziennik

    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. Załaduj Gmaila, aby wysłać dziennik

    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);
    

Odniesienia do # 1

~~

Punkt 2 - istnieje wiele różnych odpowiedzi dotyczących sposobu ładowania pliku dziennika do przeglądania i wysyłania. Wreszcie rozwiązanie tutaj działało w obu przypadkach:

  • załaduj Gmaila jako opcję
  • załącza plik pomyślnie

Wielkie dzięki dla https://stackoverflow.com/a/22367055/2162226 za poprawnie działającą odpowiedź

Gene Bo
źródło
0

Najpierw upewnij się, że polecenie adb jest wykonywalne, ustawiając PATH na narzędzia platformy Android SDK:

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

następnie uruchomić:

adb shell logcat > log.txt

LUB najpierw przejdź do narzędzi platformy adb:

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

następnie uruchomić

./adb shell logcat > log.txt
Aqib Mumtaz
źródło