¿Cómo obtengo el archivo de registro de un dispositivo Android?

129

Me gustaría extraer el archivo de registro de un dispositivo a mi PC. ¿Cómo puedo hacer eso?

Pentium10
fuente

Respuestas:

112

Logcollector es una buena opción, pero primero debe instalarlo.

Cuando quiero obtener el archivo de registro para enviar por correo, generalmente hago lo siguiente:

Macarse
fuente
Esta línea de comando no funciona para mí, obtengo esta salida. logcat read: argumento inválido
neoneye
55
tenga en cuenta que logcollector no funciona para las versiones de Android anteriores a 4.1 porque las aplicaciones ahora solo pueden leer sus propias entradas de registro. ( groups.google.com/forum/#!topic/android-log-collector/… )
Matthew Lowe
11
¿No hay algún método simple , alguna forma de simplemente extraer el archivo de registro del dispositivo una vez que está conectado a través de USB como un dispositivo de almacenamiento externo, sin la necesidad de instalar adb o algo así?
O Mapper
Asegúrese de estar en el directorio correcto para ejecutar adb. Por lo general, enC:\Users\[your username]\AppData\Local\Android\Sdk\platform-tools\
lolololol ol
30

Espero que este código ayude a alguien. Me tomó 2 días descubrir cómo iniciar sesión desde el dispositivo y luego 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;
    }

como lo señaló @mehdok

agregar el permiso al manifiesto para leer registros

<uses-permission android:name="android.permission.READ_LOGS" />
usuario1354692
fuente
1
esto funciona bien, pero funciona en todos los dispositivos que necesita<uses-permission android:name="android.permission.READ_LOGS" />
mehdok
27

Usaría algo de este tipo:

$adb logcat -d > logcat.txt

La opción -d volca todo el búfer circular en el archivo de texto y si está buscando una acción / intento particular, intente

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

Espero que esto ayude :)

Rohit
fuente
13

Para aquellos que no estén interesados ​​en la depuración o el uso de USB, adbexiste una solución más fácil. En Android 6 (No estoy seguro sobre la versión anterior) hay una opción en las herramientas del desarrollador: Take Bug Report

Al hacer clic en esta opción, se preparará un informe de error y se le pedirá que lo guarde en la unidad o que lo envíe por correo electrónico.

Encontré que esta es la forma más fácil de obtener registros. No me gusta activar la depuración de USB.

jjhavokk
fuente
1
¡Exactamente lo que estaba buscando!
YYamil
1
¿Dónde lo encuentro exactamente?
gurehbgui
11

EDITAR:

El registro interno es un búfer circular en la memoria. En realidad, hay algunos búferes circulares para cada uno de: radio, eventos, principal. El valor predeterminado es principal.

Para obtener una copia de un búfer, una técnica consiste en ejecutar un comando en el dispositivo y obtener el resultado como una variable de cadena.

SendLog es una aplicación de código abierto que hace exactamente esto: http://www.l6n.org/android/sendlog.shtml

La clave es ejecutar logcaten el dispositivo en el sistema operativo incorporado. No es tan difícil como parece, solo echa un vistazo a la aplicación de código abierto en el enlace.

Brad Hein
fuente
Esto volca la salida a la pantalla, la necesito en un archivo.
Pentium10
Puede enviar registros con aLogCat. O simplemente copie y pegue desde DDMS: P
molnarm
@molnarm Admito que mi respuesta fue un poco sobredimensionada si eso es todo lo que necesita hacer =)
Brad Hein
@BradHein Dijiste que SendLog era de código abierto pero parece que no puedo encontrar el código fuente. ¿Alguna idea de dónde está?
smith324
8

A menudo me sale el error " logcat read: Invalid argument". Tuve que borrar el registro, antes de leerlo.

Me gusta esto:

prompt> cd ~/Desktop
prompt> adb logcat -c
prompt> adb logcat | tee log.txt
neoneye
fuente
¡Gracias! Tuve ese error durante mucho tiempo, ese logcat -c lo solucionó de inmediato.
Jords
4

Una manera simple es crear sus propios métodos de recopilación de registros o incluso solo una aplicación de recopilación de registros existente en el mercado.

Para mis aplicaciones, hice una funcionalidad de informe que envía los registros a mi correo electrónico (o incluso a otro lugar; una vez que obtiene el registro, puede hacer si lo desea).

Aquí hay un ejemplo simple sobre cómo obtener el archivo de registro de un dispositivo:

Musgo
fuente
3

Simple simplemente ejecute el siguiente comando para obtener la salida a su terminal:

adb shell logcat
Weston Ganger
fuente
3

Sé que es una vieja pregunta, pero creo que aún es válida incluso en 2018.

Hay una opción para tomar un informe de error oculto en las opciones de desarrollador en cada dispositivo Android.

NOTA: Esto volcaría todo el registro del sistema

¿Cómo habilitar las opciones de desarrollador? ver: https://developer.android.com/studio/debug/dev-options

Lo que funciona para mi:

  1. Reinicie su dispositivo (para crear registros mínimos de basura para que el desarrollador los analice)
  2. Reproduce tu error
  3. Vaya a Configuración -> Opciones de desarrollador -> Tomar un informe de error
  4. Espere a que el sistema Android recopile los registros (mire la barra de progreso en la notificación)
  5. Una vez que se complete, toque la notificación para compartirla (puede usar gmail o cualquier otra cosa)

como leer esto informe de error abierto -1960-01-01-hh-mm-ss.txt

probablemente quieras buscar algo como esto:

------ 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
Piotr Z
fuente
2

Gracias al usuario 1354692 pude hacerlo más fácil, ¡con solo una línea! el que ha comentado:

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
fuente
¿Dónde está el mejor lugar para poner este código? en OnCreate?
Youngjae
2

He creado una pequeña biblioteca (.aar) para recuperar los registros por correo electrónico. Puede usarlo con cuentas de Gmail. Es bastante simple pero funciona. Puedes obtener una copia desde aquí

El sitio está en español, pero hay un PDF con una versión en inglés de la descripción del producto.

Espero que pueda ayudar.

lm2a
fuente
2

Dos pasos:

  • Generar el registro
  • Cargue Gmail para enviar el registro.

.

  1. Generar el 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. Cargue Gmail para enviar el 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);

Referencias para el n. ° 1

~~

Para el n. ° 2: existen muchas respuestas diferentes sobre cómo cargar el archivo de registro para verlo y enviarlo. Finalmente, la solución aquí realmente funcionó para ambos:

  • cargar Gmail como una opción
  • adjunta el archivo con éxito

Muchas gracias a https://stackoverflow.com/a/22367055/2162226 por la respuesta que funciona correctamente

Gene Bo
fuente
0

Primero asegúrese de que el comando adb sea ejecutable configurando PATH en android sdk platform-tools:

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

entonces corre:

adb shell logcat > log.txt

O primero muévase a adb platform-tools:

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

entonces corre

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