Zapisywanie Logcat do pliku tekstowego na urządzeniu z systemem Android

Znalazłem kilka awarii podczas uruchamiania aplikacji na urządzeniu z Androidem, który nie pokazuje się w emulatorze. Muszę więc zapisać Logcat w pliku tekstowym w pamięci urządzenia lub na karcie SD. Możesz mi zasugerować dobrą metodę, żeby to zrobić?

Author: Nithin Michael, 2013-10-24

6 answers

Użyj klasy aplikacji na początku aplikacji. Pozwala to na prawidłową obsługę plików i logów. Oto przykład. Ten fragment kodu dodaje nowy folder o nazwie "MyPersonalAppFolder" z innym folderem o nazwie "log" w nim do publicznej pamięci zewnętrznej. następnie wyjście logcat jest czyszczone, a nowe wyjście logcat jest zapisywane do nowego pliku o nazwie logcatXXX.txt, gdzie XXX to milisekundy w tym momencie.

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

Potrzebujesz odpowiednich uprawnień w swoim .plik manifestu:

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

Teraz uruchom aplikację i przejdź do "/ pamięci zewnętrznej / MyPersonalAppFolder / logs / "

Znajdziesz tam plik dziennika.

Źródło: http://www.journal.deviantdev.com/android-log-logcat-to-file-while-runtime/

Edit:

Jeśli chcesz zapisać dziennik tylko niektórych konkretnych działań..

Zastąpić:

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

Z:

process = Runtime.getRuntime().exec( "logcat -f " + logFile + " *:S MyActivity:D MyActivity2:D");
 46
Author: HeisenBerg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-06 10:40:01
adb shell logcat -t 500 > D:\logcat_output.txt

Przejdź do terminala / wiersza polecenia i przejdź do folderu z adb w nim, jeśli nie jest jeszcze dodany do zmiennych środowiskowych i wklej to polecenie.

T jest liczbą wierszy, które musisz wyświetlić

D:\logcat_output.txt jest miejscem, gdzie logcat zostanie zapisany.

 12
Author: smophos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-24 12:23:58

Użyj opcji-f z logcat w twojej klasie:

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

Spowoduje to zrzut dzienników do pliku przechowywanego urządzenia.

Zauważ, że ścieżka "/ sdcard / " może nie być dostępna na wszystkich urządzeniach. Aby uzyskać dostęp do zewnętrznej pamięci masowej , należy użyć standardowych interfejsów API.

 10
Author: Green goblin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-07 11:01:47

Ponieważ nie mogę jeszcze skomentować, wrzucę to jako odpowiedź

Zrobiłem tak, jak powiedział @ HeisenBerg, działał dobrze dla mnie, ale ponieważ od Androida 6.0 na musimy poprosić o pozwolenie w czasie uruchomienia, musiałem dodać następujące:

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

I wywołanie

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

Only on the callback onRequestPermissionsResult

 6
Author: Carlos Eduardo Millani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-18 13:57:49

Dodaj pozwolenie manifestu:

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
Author: d3n13d1,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-24 13:36:49

Jeśli potrzebujesz tylko zapisać logcat (bez kodowania), możesz użyć aplikacji aLogrec LUB aLogcat z Google Play.

Sklep Google Play: aLogcat & aLogrec

 1
Author: Tapa Save,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-16 14:02:17