web-dev-qa-db-fra.com

Enregistrement de Logcat dans un fichier texte sur un appareil Android

J'avais trouvé des plantages lors de l'exécution de l'application sur un appareil Android, qui ne s'affiche pas dans l'émulateur. J'ai donc besoin de sauvegarder le Logcat dans un fichier texte dans la mémoire de mon appareil ou sur une carte SD. Pourriez-vous s'il vous plaît me suggérer une bonne méthode pour le faire?

18
Nithin Michael

utilisez une classe d'application au début de votre application. Cela permet une gestion correcte des fichiers et des journaux. Voici un exemple. Ce morceau de code ajoute un nouveau dossier appelé «MyPersonalAppFolder» avec un autre dossier appelé «log» dans le stockage externe public. ensuite, la sortie logcat est effacée et la nouvelle sortie logcat est écrite dans un nouveau fichier appelé logcatXXX.txt, où XXX est le moment en millisecondes.

public class MyPersonalApp extends Application {

    /**
     * Called when the application is starting, before any activity, service, or receiver objects (excluding content providers) have been created.
     */
    public void onCreate() {
        super.onCreate();

        if ( isExternalStorageWritable() ) {

            File appDirectory = new File( Environment.getExternalStorageDirectory() + "/MyPersonalAppFolder" );
            File logDirectory = new File( appDirectory + "/log" );
            File logFile = new File( logDirectory, "logcat" + System.currentTimeMillis() + ".txt" );

            // create app folder
            if ( !appDirectory.exists() ) {
                appDirectory.mkdir();
            }

            // create log folder
            if ( !logDirectory.exists() ) {
                logDirectory.mkdir();
            }

            // clear the previous logcat and then write the new one to the file
            try {
                Process process = Runtime.getRuntime().exec("logcat -c");
                process = Runtime.getRuntime().exec("logcat -f " + logFile);
            } catch ( IOException e ) {
                e.printStackTrace();
            }

        } else if ( isExternalStorageReadable() ) {
            // only readable
        } else {
            // not accessible
        }
    }

    /* Checks if external storage is available for read and write */
    public boolean isExternalStorageWritable() {
        String state = Environment.getExternalStorageState();
        if ( Environment.MEDIA_MOUNTED.equals( state ) ) {
            return true;
        }
        return false;
    }

    /* Checks if external storage is available to at least read */
    public boolean isExternalStorageReadable() {
        String state = Environment.getExternalStorageState();
        if ( Environment.MEDIA_MOUNTED.equals( state ) ||
                Environment.MEDIA_MOUNTED_READ_ONLY.equals( state ) ) {
            return true;
        }
        return false;
    }
}

vous avez besoin des autorisations appropriées dans votre fichier .manifest:

<uses-permission Android:name="Android.permission.READ_LOGS" />
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission Android:name="Android.permission.READ_EXTERNAL_STORAGE" />

Maintenant, lancez votre application et allez à "/ votre stockage externe/MyPersonalAppFolder/logs /"

Vous trouverez le fichier journal ici.

source: http://www.journal.deviantdev.com/Android-log-logcat-to-file-while-runtime/

Modifier:

si vous voulez enregistrer le journal de certaines activités en particulier.

remplacer:

process = Runtime.getRuntime().exec("logcat -f " + logFile);

avec:

process = Runtime.getRuntime().exec( "logcat -f " + logFile + " *:S MyActivity:D MyActivity2:D");
59
HeisenBerg
adb Shell logcat -t 500 > D:\logcat_output.txt

Accédez à l'invite du terminal/à la commande et accédez au dossier contenant adb, s'il n'est pas déjà ajouté à vos variables d'environnement, puis collez cette commande. 

t est le nombre de lignes que vous devez voir 

D:\logcat_output.txt est l'endroit où votre logcat sera stocké.

12
smophos

Utilisez l'option -f avec logcat dans votre classe:

Runtime.getRuntime().exec("logcat -f" + " /sdcard/Logcat.txt");

Cela videra les journaux sur le périphérique de stockage de fichiers.

Notez que le chemin "/ sdcard /" peut ne pas être disponible sur tous les périphériques. Vous devez utiliser les API standard pour accéder au stockage externe .

10
Green goblin

Comme je ne peux pas encore commenter, je posterai ceci comme une réponse

Comme l'a dit @HeisenBerg, cela a bien fonctionné pour moi, mais depuis Android 6.0, nous devons demander l'autorisation au moment de l'exécution, j'ai dû ajouter les éléments suivants:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    if(checkSelfPermission(Android.Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, new String[]{Android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
    }
}

Et appeler

process = Runtime.getRuntime().exec("logcat -f " + logFile);

Seulement sur le callback onRequestPermissionsResult

6

Ajoutez la permission de manifeste:

uses-permission Android:name="Android.permission.READ_LOGS" 


private static final String COMMAND = "logcat -d -v time";


public static void fetch(OutputStream out, boolean close) throws IOException {
    byte[] log = new byte[1024 * 2];
    InputStream in = null;
    try {
        Process proc = Runtime.getRuntime().exec(COMMAND);
        in = proc.getInputStream();
        int read = in.read(log);
        while (-1 != read) {
            out.write(log, 0, read);
            read = in.read(log);
        }
    }
    finally {
        if (null != in) {
            try {
                in.close();
            }
            catch (IOException e) {
                // ignore
            }
        }

        if (null != out) {
            try {
                out.flush();
                if (close)
                    out.close();
            }
            catch (IOException e) {
                // ignore
            }
        }
    }
}

public static void fetch(File file) throws IOException {
    FileOutputStream fos = new FileOutputStream(file);
    fetch(fos, true);
}
2
d3n13d1

Si vous devez uniquement enregistrer le logcat (sans votre code), vous pouvez utiliser les applications aLogrec ou aLogcat de Google Play.

Google Play Store: aLogcat & aLogrec

1
Tapa Save

Apparemment, Android.permission.READ_LOGS n'est accordé qu'aux applications système des dernières versions d'Android.

0
Pablo Valdes