Chciałbym pobrać plik dziennika z urządzenia na komputer. Jak mogę to zrobić?
131
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:
adb shell logcat > log.txt
adb
. Zwykle wC:\Users\[your username]\AppData\Local\Android\Sdk\platform-tools\
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" />
źródło
<uses-permission android:name="android.permission.READ_LOGS" />
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 :)
źródło
Dla tych, którzy nie są zainteresowani debugowaniem USB lub używaniem,
adb
istnieje łatwiejsze rozwiązanie. W Androidzie 6 (Nie jestem pewien co do poprzedniej wersji) w narzędziach programistycznych dostępna jest opcja: Take Bug ReportKliknię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.
źródło
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
logcat
na urządzeniu z wbudowanym systemem operacyjnym. To nie jest tak trudne, jak się wydaje, po prostu sprawdź aplikację open source w linku.źródło
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
źródło
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:
źródło
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:
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
źródło
Po prostu uruchom następujące polecenie, aby uzyskać dane wyjściowe na terminalu:
źródło
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){}
źródło
OnCreate
?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.
źródło
.
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; }
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);
~~
źródło
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
źródło