Как постоянно контролировать файл LogCat? - PullRequest
5 голосов
/ 11 января 2011

Мне нужно каким-то образом отслеживать журнал LogCat, это означает, что во время работы моей службы мне нужно читать 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);
            }

. Если я уберу опцию -d, она не выйдет, но и не будет работать.Так как же я могу изменить приведенный ниже код, чтобы постоянно читать новые записи из LogCat?

Ответы [ 2 ]

6 голосов
/ 09 августа 2012

Вот как я это сделал, используя предложение Цзяхао Лю:

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;
    }
  }
}
2 голосов
/ 01 мая 2011

Вы можете создать новый поток для запуска logcat (без опции -d) в фоновом режиме.

Примечание: Используйте буферные события вместо процесса ActivityManager, это более точно."logcat -b events"

...