Android 如何重定向logcat输出?
有没有办法将logcat的输出重定向到InputStream或类似的东西?我正在考虑如何在C中重定向stderr。Android 如何重定向logcat输出?,android,logcat,Android,Logcat,有没有办法将logcat的输出重定向到InputStream或类似的东西?我正在考虑如何在C中重定向stderr。 我想这样做,当我的应用程序启动时,它会被重定向,所有发生的事情都会被转储到文件中。LogCat输出的唯一重定向可能是documentend和 不可能在应用程序本身中重用LogCat输出。但是,您可以按照您的要求进行调试。如果您可以连接设备进行调试,则可以从命令行执行此操作 $ adb logcat > textfile.txt 我找到的最简单的方法是使用System.set
我想这样做,当我的应用程序启动时,它会被重定向,所有发生的事情都会被转储到文件中。LogCat输出的唯一重定向可能是documentend和
不可能在应用程序本身中重用LogCat输出。但是,您可以按照您的要求进行调试。如果您可以连接设备进行调试,则可以从命令行执行此操作
$ adb logcat > textfile.txt
我找到的最简单的方法是使用
System.setErr
。我允许您轻松地将错误输出重定向到文件
例如:
System.setErr(new PrintStream(new File("<file_path>"))
System.setErr(新打印流(新文件(“”))
要仅从应用程序中筛选logcat,请尝试以下操作:
int pid = android.os.Process.myPid();
File outputFile = new File(Environment.getExternalStorageDirectory() + "/logcat.txt");
Log.d("zzz","outputFile: " + outputFile);
try {
String command = "logcat | grep " + pid + " > " + outputFile.getAbsolutePath();
Log.d("zzz","command: " + command);
Process p = Runtime.getRuntime().exec("su");
OutputStream os = p.getOutputStream();
os.write((command + "\n").getBytes("ASCII"));
} catch (IOException e) {
}
在Kotlin中,这就是我使用的,它似乎创建并登录到logcat.txt文件(位于应用程序目录中),无论应用程序正在调试还是直接从平板电脑运行。(旁注:由于某种原因,在我停止应用程序并重新连接设备之前,该目录不会刷新或显示在文件浏览器中。)(感谢以前的贡献者的帮助)
在获得适当权限的情况下查看此处,您可以阅读logsHow long。这种情况持续多久?我的意思是,如果我重新启动设备,它还会被重定向吗?不,只要“adb”处于活动状态,它就会被重定向。重新启动时,“adb”协议不起作用,因此当时它不会被重定向。@rodkarom不,当您重新启动时,adb会断开连接,但您可以重新启动重新启动时再次启动或发送到其他文件。如果设备从USB拔下?logcat是否也将关闭?@spatulamania这将仅捕获打印到
System.err
(如果以相同方式重定向,则可能会捕获打印到System.out
)的输出但是,输出将不包括每行的前缀Android ads(时间戳、PID、TID等),并且通过Log
类记录的任何内容也不会在此处重定向。可能有一种更简单的方法:在不使用su
的情况下运行logcat
,并且不向应用程序授予READ\u LOGS
权限,这会限制返回到调用方UID的条目(即,您的应用程序,包括早期实例和子流程)。不过,这在Android发行版之间似乎有所不同。否则,logcat
还具有-e
选项,可以通过正则表达式进行过滤。
located in utilities...
val publicDirectory = globalContext.getExternalFilesDir(null)
publicDirectoryName = publicDirectory?.toString() + "/"
fun redirectLogcatToFile() {
try {
val filename =
File(Utilities.publicDirectoryName + "logcat.txt")
filename.createNewFile()
val cmd = "logcat -v time -f " + filename.getAbsolutePath() +" -s " + logcatTag
Runtime.getRuntime().exec(cmd)
} catch (ex: Exception ) {
Utilities.toastOnAnyThread("Utilities.redirectLogcatToFile: " + ex.message)
}
}
fun Log( message : String ){
Log.i(logcatTag, message )
}