Chciałbym pobrać plik dziennika z urządzenia na komputer. Jak mogę to zrobić?
Odpowiedzi:
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.txtadb. 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" />
<uses-permission android:name="android.permission.READ_LOGS" />
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.
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.
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
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:
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
Po prostu uruchom następujące polecenie, aby uzyskać dane wyjściowe na terminalu:
adb shell logcat
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){}
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.
Dwa kroki:
- Wygeneruj dziennik
- Załaduj Gmaila, aby wysłać dziennik
.
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);
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ź
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