Como obtenho o arquivo de log de um dispositivo Android?

129

Gostaria de puxar o arquivo de log de um dispositivo para o meu PC. Como eu posso fazer isso?

Pentium10
fonte

Respostas:

112

O Logcollector é uma boa opção, mas você precisa instalá-lo primeiro.

Quando quero que o arquivo de log seja enviado por correio, geralmente faço o seguinte:

Macarse
fonte
Esta linha de comando não funciona para mim, eu recebo esta saída. logcat lido: Argumento inválido
neoneye
5
observe que o logcollector não funciona para versões do Android acima da 4.1, porque agora os aplicativos só podem ler suas próprias entradas de log. ( groups.google.com/forum/#!topic/android-log-collector/… )
Matthew Lowe
11
Não existe um método simples , alguma maneira de simplesmente extrair o arquivo de log do dispositivo depois que ele é conectado via USB como um dispositivo de armazenamento externo, sem a necessidade de instalar o adb ou algo assim?
OR
Verifique se você está no diretório certo para executar adb. Geralmente emC:\Users\[your username]\AppData\Local\Android\Sdk\platform-tools\
lolololol
30

Espero que esse código ajude alguém. Levei 2 dias para descobrir como fazer logon no dispositivo e depois filtrá-lo:

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

como apontado por @mehdok

adicione a permissão ao manifesto para ler logs

<uses-permission android:name="android.permission.READ_LOGS" />
user1354692
fonte
1
isso funciona bem, mas funciona em todos os dispositivos necessários<uses-permission android:name="android.permission.READ_LOGS" />
mehdok
27

Eu usaria algo desse tipo:

$adb logcat -d > logcat.txt

A opção -d despeja todo o buffer circular no arquivo de texto e, se você estiver procurando por uma ação / intenção específica, tente

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

Espero que isto ajude :)

Rohit
fonte
13

Para aqueles que não estão interessados ​​em depurar ou usar USB, adbexiste uma solução mais fácil. No Android 6 (não tenho certeza da versão anterior), há uma opção nas ferramentas do desenvolvedor: Relatório de erros

Clicar nesta opção preparará um relatório de erro e solicitará que você o salve na unidade ou envie-o por email.

Eu achei que essa era a maneira mais fácil de obter logs. Não gosto de ativar a depuração USB.

jjhavokk
fonte
1
Exatamente o que eu estava procurando!
YYamil
1
Onde encontro exatamente?
precisa saber é o seguinte
11

EDITAR:

O log interno é um buffer circular na memória. Na verdade, existem alguns desses buffers circulares para cada um: rádio, eventos, principal. O padrão é principal.

Para obter uma cópia de um buffer, uma técnica envolve executar um comando no dispositivo e obter a saída como uma variável de sequência.

O SendLog é um aplicativo de código aberto que faz exatamente isso: http://www.l6n.org/android/sendlog.shtml

A chave é executar logcatno dispositivo no sistema operacional incorporado. Não é tão difícil quanto parece, basta verificar o aplicativo de código aberto no link.

Brad Hein
fonte
Isso despeja a saída na tela, preciso em um arquivo.
Pentium10
Você pode enviar logs com aLogCat. Ou simplesmente copiar e colar a partir DDMS: P
molnarm
@molnarm Admito a minha resposta foi um pouco mais de engenharia se isso é tudo que ele precisa fazer =)
Brad Hein
@BradHein Você disse que o SendLog era de código aberto, mas não consigo encontrar o código-fonte. Alguma idéia de onde fica?
smith324
8

Frequentemente, recebo o erro " logcat read: Invalid argument". Eu tive que limpar o log, antes de ler o log.

Eu faço assim:

prompt> cd ~/Desktop
prompt> adb logcat -c
prompt> adb logcat | tee log.txt
neoneye
fonte
Obrigado! Eu estava tendo esse erro há muito tempo, que o logcat -c o corrigiu imediatamente!
Jords 31/01
4

Uma maneira simples é criar seus próprios métodos de coletor de log ou mesmo apenas um aplicativo coletor de log existente no mercado.

Para meus aplicativos, criei uma funcionalidade de relatório que envia os logs para o meu email (ou mesmo para outro local - depois de obter o log, você pode fazer o que quiser).

Aqui está um exemplo simples sobre como obter o arquivo de log de um dispositivo:

Musgo
fonte
3

Simples, basta executar o seguinte comando para obter a saída para o seu terminal:

adb shell logcat
Weston Ganger
fonte
3

Sei que é uma pergunta antiga, mas acredito que ainda é válida até em 2018.

Há uma opção para obter um relatório de erro oculto nas opções do desenvolvedor em todos os dispositivos Android.

NOTA: Isso despejaria o log inteiro do sistema

Como habilitar as opções do desenvolvedor? consulte: https://developer.android.com/studio/debug/dev-options

O que funciona para mim:

  1. Reinicie seu dispositivo (para criar logs mínimos de lixo para análise do desenvolvedor)
  2. Reproduza seu bug
  3. Vá para Configurações -> Opções do desenvolvedor -> Faça um relatório de erro
  4. Aguarde o sistema Android coletar os logs (observe a barra de progresso na notificação)
  5. Depois de concluído, toque na notificação para compartilhá-la (você pode usar o Gmail ou qualquer outra coisa)

como ler isso? open bugreport-1960-01-01-hh-mm-ss.txt

você provavelmente deseja procurar algo assim:

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

ou:

------ SYSTEM LOG (logcat -v threadtime -v printable -d *:v) ------
--------- beginning of main
Piotr Z
fonte
2

Graças ao user1354692, fiquei mais fácil, com apenas uma linha! o que ele comentou:

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
fonte
onde é o melhor lugar para colocar esse código? em OnCreate?
Youngjae 31/03
2

Criei uma pequena biblioteca (.aar) para recuperar os logs por email. Você pode usá-lo com contas do Gmail. É bem simples, mas funciona. Você pode obter uma cópia daqui

O site está em espanhol, mas há um PDF com uma versão em inglês da descrição do produto.

Espero que possa ajudar.

lm2a
fonte
2

Dois passos:

  • Gere o log
  • Carregue o Gmail para enviar o log

.

  1. Gere o log

    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. Carregue o Gmail para enviar o log

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

Referências para # 1

~~

Para o número 2 - existem muitas respostas diferentes para saber como carregar o arquivo de log para visualizar e enviar. Finalmente, a solução aqui realmente funcionou para ambos:

  • carregar o Gmail como uma opção
  • anexa o arquivo com sucesso

Muito obrigado a https://stackoverflow.com/a/22367055/2162226 pela resposta correta

Gene Bo
fonte
0

Primeiro, verifique se o comando adb é executável configurando PATH para android sdk platform-tools:

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

então corra:

adb shell logcat > log.txt

OU primeiro passo para as ferramentas da plataforma adb:

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

então corra

./adb shell logcat > log.txt
Aqib Mumtaz
fonte