我看到有人抱怨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
。
答案 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" />