2011-01-11 12 views
5

Necesito monitorear de alguna manera el registro LogCat, lo que significa que mientras mi servicio se está ejecutando necesito leer el LogCat para nuevas entradas. En este momento sólo sé cómo recuperar una vez que el registro:¿Cómo se monitorea constantemente el archivo LogCat?

Process mLogcatProc = null; 
    BufferedReader reader = null; 
    try 
    { 
      mLogcatProc = Runtime.getRuntime().exec(new String[] 
        {"logcat", "-d", "ActivityManager:I *:S" });   

      reader = new BufferedReader(new InputStreamReader 
    (mLogcatProc.getInputStream())); 

      String line; 
      final StringBuilder log = new StringBuilder(); 
      String separator = System.getProperty("line.separator"); 

      while ((line = reader.readLine()) != null) 
      { 
        log.append(line); 
        log.append(separator); 
      } 

Si quito la opción -d no va a salir, sino también que tampoco lo hará el trabajo. Entonces, ¿cómo puedo modificar el código de abajo para leer continuamente nuevas entradas de LogCat?

+2

¿Puedo preguntar por qué quieres hacer esto? Suena como una idea generalmente mala. – torkildr

+1

adb logcat? ¿Por qué quieres logcat dentro de tu programa? –

+1

Porque parece ser la única forma de saber cuándo comienza una actividad. Para qué ? Para una aplicación de protección de aplicaciones. Como App Protector ... y si miras los permisos, necesita leer los registros del sistema ... – Alex

Respuesta

2

Puede crear un nuevo hilo para ejecutar el logcat (sin la opción -d) en el fondo.

Nota: Use los eventos de búfer en lugar del proceso ActivityManager, es más preciso. "LogCat eventos -b"

6

Esta es la forma en que lo hice, usando la sugerencia de Jia Hao Liu:

ReadThread thread; 

public void startRecordingLogs() 
{ 
    if(thread == null || !thread.isAlive()) 
    { 
    ReadThread thread = new ReadThread(); 
    thread.start(); 
    } 
} 

public String stopRecordingLogs() 
{ 
    String results = thread.stopLogging(); 
    return results; 
} 

private class ReadThread extends Thread{ 

    String results; 
    Process process; 
    Object lockObject = new Object(); 

    public void run(){ 
    synchronized(lockObject) 
    { 
     process = Runtime.getRuntime().exec("logcat -v time");   

     reader = new BufferedReader(new InputStreamReader (process.getInputStream())); 

     String line; 
     final StringBuilder log = new StringBuilder(); 
     String separator = System.getProperty("line.separator"); 

     while ((line = reader.readLine()) != null) 
     { 
     log.append(line); 
     log.append(separator); 
     } 
    } 

    results = log.toString(); 
    } 

    public String stopLogging() 
    { 
    process.destroy(); 
    synchronized(lockObject) 
    { 
     return results; 
    } 
    } 
} 
+0

¿dónde se definen los "resultados"? – gonzobrains

+0

@gonzobrains Justo debajo de donde se define la clase ReadThread. – you786

+0

Sí, pero a menos que defina otro "resultado" fuera de la clase, los resultados no se definen para stopRecordingLogs(). – gonzobrains

Cuestiones relacionadas