Сохранение Logcat в текстовый файл на устройстве Android

Я обнаружил некоторые сбои при запуске приложения в устройстве Android, которое не отображается в эмуляторе. Поэтому мне нужно сохранить Logcat в текстовом файле в памяти устройства или на SD-карте. Не могли бы вы предложить мне хороший способ сделать это?

adb shell logcat -t 500 > D:\logcat_output.txt 

Перейдите в свою команду терминала / командной строки и перейдите к папке с помощью adb в ней, если она еще не добавлена ​​к вашим переменным окружения и вставляет эту команду.

T – числовые строки, которые необходимо просмотреть

D: \ logcat_output.txt, где ваш логарифм будет сохранен.

Используйте класс приложения в начале вашего приложения. Это позволяет обрабатывать файлы и журналы. Вот пример. Этот фрагмент кода добавляет новую папку с именем «MyPersonalAppFolder» с другой папкой с именем «log» в нее в общедоступное внешнее хранилище. После этого вывод logcat очищается, а новый вывод logcat записывается в новый файл с именем logcatXXX.txt, где XXX – это миллисекундное время в данный момент.

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

Вам нужны правильные разрешения в вашем файле .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" /> 

Теперь запустите приложение и перейдите "/ ваше внешнее хранилище / MyPersonalAppFolder / logs /"

Там вы найдете файл журнала.

Источник: http://www.journal.deviantdev.com/android-log-logcat-to-file-while-runtime/

Редактировать:

Если вы хотите сохранить журнал только определенных действий.

заменить:

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

с:

 process = Runtime.getRuntime().exec( "logcat -f " + logFile + " *:S MyActivity:D MyActivity2:D"); 

Используйте параметр -f с logcat в своем классе:

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

Это приведет к выгрузке журналов в хранимое устройство.

Обратите внимание, что путь «/ sdcard /» может быть недоступен на всех устройствах. Вы должны использовать стандартные API для доступа к внешнему хранилищу .

Добавьте разрешение манифеста:

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

Если вам нужно сохранить logcat (без кодирования), вы можете использовать приложения aLogrec или aLogcat из Google Play.

Магазин Google Play: aLogcat & aLogrec

Поскольку я не могу комментировать, я опубликую это как ответ

Я сделал, как сказал @HeisenBerg, отлично работал для меня, но поскольку с Android-версии 6.0 мы должны просить разрешения в Run Time, мне пришлось добавить следующее:

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

И позвоните

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

Только при onRequestPermissionsResult