我怎样才能读取最后一行的logcat?

时间:2012-04-16 08:30:42

标签: android shell stdout logcat

我看到有人抱怨Logcat只输出最后一行。我想问一个保留问题,我怎么能产生这个只输出最后一行的条件?

这是我通过启动线程来读取日志的方式。

public class ReadLog implements Runnable{
        private boolean running = true;

        public void stop(){
            running = false;
        }

        @Override
        public void run() {
            Process proc = null;
            try {
                //Runtime.getRuntime().exec("/system/bin/logcat -c");
                proc = Runtime.getRuntime().exec("/system/bin/logcat ");
              }catch(IOException e) {
                   e.printStackTrace();
            }
            if(proc != null){
                BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream()));
                String line= null;
                try {
                    while((line=reader.readLine())!=null && running){
                        if(line.contains("specific word")){
                            doSomething();//do something base on log
                            running = false;
                        }
                    }
                }
                catch (IOException e) {
                    e.printStackTrace();
                }
                finally{
                    proc.destroy();
                }
            }
        }
    }

我想只阅读最新的一行。问题是它会触发doSomething(),即使“特定单词”不在最后一行,除非我在开​​始运行之前添加Runtime.getRuntime().exec("/system/bin/logcat -c");行清除日志。

确实,我可以再添加一个while((line=reader.readLine())!=null && running){}让BufferedReader在开始运行之前进入最后一行,但这可能需要很长时间而且为时已晚。

我试过Runtime.getRuntime().exec("/system/bin/logcat | tail -n 1"); 但是没有运气tail不接受标准输入。 我要求快速输出stdout最后一行的任何命令,就像tail -n 1 FILE

1 个答案:

答案 0 :(得分:1)

尝试Runtime.getRuntime().exec("/system/bin/logcat -d | tail -n 1");

根据logcat文档 - > -d:“将日志转储到屏幕并退出。”

然后readline将返回最后一个新行。 (我没有测试过。)

编辑:

实际上| tail -n 1对“exec”没有影响,但是使用“-d”可以轻松获得最后一个日志行。

try {
    //Executes the command.
    Process process = Runtime.getRuntime().exec(
        "/system/bin/logcat -d");

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

    String output;
    String lastLine = null;
    while ((output = reader.readLine()) != null) {
        lastLine = output;
    }
    reader.close();

    //Waits for the command to finish.
    process.waitFor();

    if(lastLine != null)
        System.out.println("Last log line : " + lastLine);
} catch (IOException e) {
    throw new RuntimeException(e);
} catch (InterruptedException e) {
    throw new RuntimeException(e);
}

不要忘记向您的清单添加READ_LOGS权限

<uses-permission android:name="android.permission.READ_LOGS" />