without tag studio log hacer como app android logcat android-logcat

android - tag - Lea logcat programáticamente dentro de la aplicación



logcat without android studio (5)

Quiero leer y reaccionar a los registros de logcat dentro de mi aplicación.

Encontré el siguiente código:

try { Process process = Runtime.getRuntime().exec("logcat -d"); BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(process.getInputStream())); StringBuilder log=new StringBuilder(); String line = ""; while ((line = bufferedReader.readLine()) != null) { log.append(line); } TextView tv = (TextView)findViewById(R.id.textView1); tv.setText(log.toString()); } catch (IOException e) {}

Este código de hecho devuelve los registros de logcat que se realizaron hasta que se inició la aplicación:

Pero, ¿es posible escuchar continuamente incluso los registros logcat nuevos?


Aquí hay un conjunto desplegable rápido que se puede usar para capturar todos los elementos de registro actuales o todos los nuevos (desde una última solicitud).

Debe modificar / extender esto, ya que es posible que desee devolver un flujo continuo en lugar de un LogCapture.

El "Manual" Android LogCat: https://developer.android.com/studio/command-line/logcat.html import android.util.Log;

import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Calendar; import java.util.Collection; import java.util.Date; import java.util.List; import java.util.Stack; /** * Created by triston on 6/30/17. */ public class Logger { // http://www.java2s.com/Tutorial/Java/0040__Data-Type/SimpleDateFormat.htm private static final String ANDROID_LOG_TIME_FORMAT = "MM-dd kk:mm:ss.SSS"; private static SimpleDateFormat logCatDate = new SimpleDateFormat(ANDROID_LOG_TIME_FORMAT); public static String lineEnding = "/n"; private final String logKey; private static List<String> logKeys = new ArrayList<String>(); Logger(String tag) { logKey = tag; if (! logKeys.contains(tag)) logKeys.add(logKey); } public static class LogCapture { private String lastLogTime = null; public final String buffer; public final List<String> log, keys; LogCapture(String oLogBuffer, List<String>oLogKeys) { this.buffer = oLogBuffer; this.keys = oLogKeys; this.log = new ArrayList<>(); } private void close() { if (isEmpty()) return; String[] out = log.get(log.size() - 1).split(" "); lastLogTime = (out[0]+" "+out[1]); } private boolean isEmpty() { return log.size() == 0; } public LogCapture getNextCapture() { LogCapture capture = getLogCat(buffer, lastLogTime, keys); if (capture == null || capture.isEmpty()) return null; return capture; } public String toString() { StringBuilder output = new StringBuilder(); for (String data : log) { output.append(data+lineEnding); } return output.toString(); } } /** * Get a list of the known log keys * @return copy only */ public static List<String> getLogKeys() { return logKeys.subList(0, logKeys.size() - 1); } /** * Platform: Android * Get the logcat output in time format from a buffer for this set of static logKeys. * @param oLogBuffer logcat buffer ring * @return A log capture which can be used to make further captures. */ public static LogCapture getLogCat(String oLogBuffer) { return getLogCat(oLogBuffer, null, getLogKeys()); } /** * Platform: Android * Get the logcat output in time format from a buffer for a set of log-keys; since a specified time. * @param oLogBuffer logcat buffer ring * @param oLogTime time at which to start capturing log data, or null for all data * @param oLogKeys logcat tags to capture * @return A log capture; which can be used to make further captures. */ public static LogCapture getLogCat(String oLogBuffer, String oLogTime, List<String> oLogKeys) { try { List<String>sCommand = new ArrayList<String>(); sCommand.add("logcat"); sCommand.add("-bmain"); sCommand.add("-vtime"); sCommand.add("-s"); sCommand.add("-d"); sCommand.add("-T"+oLogTime); for (String item : oLogKeys) sCommand.add(item+":V"); // log level: ALL sCommand.add("*:S"); // ignore logs which are not selected Process process = new ProcessBuilder().command(sCommand).start(); BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(process.getInputStream())); LogCapture mLogCapture = new LogCapture(oLogBuffer, oLogKeys); String line = ""; long lLogTime = logCatDate.parse(oLogTime).getTime(); if (lLogTime > 0) { // Synchronize with "NO YEAR CLOCK" @ unix epoch-year: 1970 Calendar calendar = Calendar.getInstance(); calendar.setTime(new Date(oLogTime)); calendar.set(Calendar.YEAR, 1970); Date calDate = calendar.getTime(); lLogTime = calDate.getTime(); } while ((line = bufferedReader.readLine()) != null) { long when = logCatDate.parse(line).getTime(); if (when > lLogTime) { mLogCapture.log.add(line); break; // stop checking for date matching } } // continue collecting while ((line = bufferedReader.readLine()) != null) mLogCapture.log.add(line); mLogCapture.close(); return mLogCapture; } catch (Exception e) { // since this is a log reader, there is nowhere to go and nothing useful to do return null; } } /** * "Error" * @param e */ public void failure(Exception e) { Log.e(logKey, Log.getStackTraceString(e)); } /** * "Error" * @param message * @param e */ public void failure(String message, Exception e) { Log.e(logKey, message, e); } public void warning(String message) { Log.w(logKey, message); } public void warning(String message, Exception e) { Log.w(logKey, message, e); } /** * "Information" * @param message */ public void message(String message) { Log.i(logKey, message); } /** * "Debug" * @param message a Message */ public void examination(String message) { Log.d(logKey, message); } /** * "Debug" * @param message a Message * @param e An failure */ public void examination(String message, Exception e) { Log.d(logKey, message, e); } }

En su proyecto que realiza el registro de actividad:

Logger log = new Logger("SuperLog"); // perform logging methods

Cuando desee capturar todo lo que ha registrado a través de "Logger"

LogCapture capture = Logger.getLogCat("main");

Cuando tienes hambre y quieres comer más troncos

LogCapture nextCapture = capture.getNextCapture();

Puede obtener la captura como una cadena con

String captureString = capture.toString();

O puede obtener los elementos de registro de la captura con

String logItem = capture.log.get(itemNumber);

No hay un método estático exacto para capturar las claves de registro externas, pero hay una manera, no obstante,

LogCapture foreignCapture = Logger.getLogCat("main", null, foreignCaptureKeyList);

Usar lo anterior también le permitirá llamar a Logger.this.nextCapture en la captura extranjera.


La bandera "-c" borra el buffer.

-c Borra (vacía) todo el registro y sale.


Puede borrar su logcat con este método que estoy usando para borrar después de escribir logcat en un archivo para evitar líneas duplicadas:

public void clearLog(){ try { Process process = new ProcessBuilder() .command("logcat", "-c") .redirectErrorStream(true) .start(); } catch (IOException e) { } }


Puede seguir leyendo los registros, simplemente eliminando el indicador "-d" en su código anterior.

El indicador "-d" indica a logcat que muestre el contenido del registro y salga. Si quita la bandera, logcat no terminará y sigue enviando cualquier nueva línea añadida.

Solo tenga en cuenta que esto puede bloquear su aplicación si no está correctamente diseñada.

buena suerte.


//CLEAR LOGS Runtime.getRuntime().exec("logcat -c"); //LISTEN TO NEW LOGS Process pq=Runtime.getRuntime().exec("logcat v main"); BufferedReader brq = new BufferedReader(new InputStreamReader(pq.getInputStream())); String sq=""; while ((sq = brq.readLine()) != null) { //CHECK YOUR MSG HERE if(sq.contains("send MMS with param")) { } }

Estoy usando esto en mi aplicación y funciona. Y puede usar el código anterior en Timer Task para que no detenga su hilo principal

Timer t; this.t.schedule(new TimerTask() { public void run() { try { ReadMessageResponse.this.startRecord();//ABOVE METHOD HERE } catch (IOException ex) { //NEED TO CHECK SOME VARIABLE TO STOP MONITORING LOGS System.err.println("Record Stopped"); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { ReadMessageResponse.this.t.cancel(); } } }, 0L); }