Come posso ottenere il file di registro da un dispositivo Android?


129

Vorrei estrarre il file di registro da un dispositivo al mio PC. Come lo posso fare?

Risposte:


112

Logcollector è una buona opzione ma devi prima installarlo.

Quando voglio ottenere il file di registro da inviare per posta, di solito faccio quanto segue:


Questa riga di comando non funziona per me, ho questo output. logcat read: Argomento non valido
neoneye,

5
si noti che logcollector non funziona per le versioni di Android precedenti alla 4.1 perché ora alle applicazioni è consentito leggere solo le proprie voci di registro. ( groups.google.com/forum/#!topic/android-log-collector/… )
Matthew Lowe

11
Non esiste un metodo semplice , un modo per estrarre semplicemente il file di registro dal dispositivo una volta collegato tramite USB come dispositivo di archiviazione esterno, senza la necessità di installare adb o qualcosa del genere?
OR Mapper,

Assicurati di essere nella directory giusta per l'esecuzione adb. Di solito inC:\Users\[your username]\AppData\Local\Android\Sdk\platform-tools\
lolololol ol

30

Spero che questo codice possa aiutare qualcuno. Mi ci sono voluti 2 giorni per capire come accedere dal dispositivo, quindi filtrarlo:

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

come indicato da @mehdok

aggiungere l'autorizzazione al manifest per la lettura dei registri

<uses-permission android:name="android.permission.READ_LOGS" />

1
funziona benissimo, ma funziona su tutti i dispositivi di cui hai bisogno<uses-permission android:name="android.permission.READ_LOGS" />
mehdok,

27

Vorrei usare qualcosa di questo tipo:

$adb logcat -d > logcat.txt

L'opzione -d scarica l'intero buffer circolare nel file di testo e se stai cercando un'azione / intento particolare, prova

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

Spero che questo ti aiuti :)


13

Per coloro che non sono interessati al debug o all'utilizzo di USB, adbesiste una soluzione più semplice. In Android 6 (non sono sicuro della versione precedente) c'è un'opzione sotto gli strumenti di sviluppo: Prendi il rapporto sui bug

Facendo clic su questa opzione verrà preparato un rapporto sui bug e verrà richiesto di salvarlo su Drive o di inviarlo tramite e-mail.

Ho trovato che questo è il modo più semplice per ottenere i registri. Non mi piace attivare il debug USB.


1
Esattamente quello che stavo cercando!
Yamam,

1
Dove lo trovo esattamente?
gurehbgui,

11

MODIFICARE:

Il registro interno è un buffer circolare in memoria. In realtà ci sono alcuni di questi buffer circolari per ciascuno di: radio, eventi, principale. L'impostazione predefinita è principale.

Per ottenere una copia di un buffer, una tecnica prevede l'esecuzione di un comando sul dispositivo e l'output come variabile stringa.

SendLog è un'app open source che fa proprio questo: http://www.l6n.org/android/sendlog.shtml

La chiave è eseguire logcatsul dispositivo nel sistema operativo incorporato. Non è così difficile come sembra, basta dare un'occhiata all'app open source nel link.


Questo scarica l'output sullo schermo, ne ho bisogno in un file.
Pentium10

È possibile inviare registri con aLogCat. O semplicemente copia-incolla da DDMS: P
molnarm,

@molnarm Ammetto che la mia risposta è stata leggermente ingegnerizzata se questo è tutto ciò che deve fare =)
Brad Hein,

@BradHein Hai detto che SendLog era open source ma non riesco a trovare il codice sorgente. Qualche idea su dove sia?
smith324

8

Ricevo spesso l'errore " logcat read: Invalid argument". Ho dovuto cancellare il registro, prima di leggere dal registro.

Mi piace così:

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

Grazie! Ho avuto quell'errore per molto tempo, quel logcat -c lo ha riparato immediatamente!
Jords

4

Un modo semplice è creare i propri metodi di raccolta dei log o anche solo un'app di raccolta dei log esistente sul mercato.

Per le mie app ho creato una funzionalità di report che invia i registri alla mia e-mail (o anche a un altro posto - una volta ottenuto il registro puoi fare ciò che vuoi con esso).

Ecco un semplice esempio su come ottenere il file di registro da un dispositivo:


3

Semplice è sufficiente eseguire il comando seguente per ottenere l'output sul terminale:

adb shell logcat

3

So che è una vecchia domanda, ma credo che sia valido anche nel 2018.

C'è un'opzione per prendere una segnalazione di bug nascosta in Opzioni sviluppatore in ogni dispositivo Android.

NOTA: questo eliminerebbe il registro dell'intero sistema

Come abilitare le opzioni per gli sviluppatori? vedi: https://developer.android.com/studio/debug/dev-options

Cosa funziona per me:

  1. Riavvia il dispositivo (al fine di creare registri minimi di immondizia che gli sviluppatori possano analizzare)
  2. Riproduci il tuo bug
  3. Vai su Impostazioni -> Opzioni sviluppatore -> Prendi una segnalazione di bug
  4. Attendi che il sistema Android raccolga i log (guarda la barra di avanzamento nella notifica)
  5. Una volta completato, tocca la notifica per condividerla (puoi usare Gmail o chiunque altro)

come leggere questo? apri bugreport-1960-01-01-hh-mm-ss.txt

probabilmente vorrai cercare qualcosa del genere:

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

o:

------ SYSTEM LOG (logcat -v threadtime -v printable -d *:v) ------
--------- beginning of main

2

Grazie a user1354692 ho potuto renderlo più semplice, con una sola riga! quello che ha commentato:

try {
    File file = new File(Environment.getExternalStorageDirectory(), String.valueOf(System.currentTimeMillis()));
    Runtime.getRuntime().exec("logcat -d -v time -f " + file.getAbsolutePath());}catch (IOException e){}

dov'è il posto migliore dove inserire questo codice? in OnCreate?
Youngjae

2

Ho creato una piccola libreria (.aar) per recuperare i registri via e-mail. Puoi usarlo con account Gmail. È piuttosto semplice ma funziona. Puoi ottenere una copia da qui

Il sito è in spagnolo, ma esiste un PDF con una versione inglese della descrizione del prodotto.

Spero possa essere d'aiuto.


2

Due passaggi:

  • Genera il registro
  • Carica Gmail per inviare il registro

.

  1. Genera il registro

    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. Carica Gmail per inviare il registro

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

Riferimenti per # 1

~~

Per # 2 - ci sono molte risposte diverse là fuori su come caricare il file di registro da visualizzare e inviare. Infine, la soluzione qui ha funzionato in entrambi i modi:

  • carica Gmail come opzione
  • allega il file correttamente

Grazie mille a https://stackoverflow.com/a/22367055/2162226 per la risposta correttamente funzionante


0

Per prima cosa assicurati che il comando adb sia eseguibile impostando PATH su android sdk platform-tools:

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

quindi eseguire:

adb shell logcat > log.txt

O prima passa agli strumenti della piattaforma adb:

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

quindi corri

./adb shell logcat > log.txt
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.