Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何重定向logcat输出?_Android_Logcat - Fatal编程技术网

Android 如何重定向logcat输出?

Android 如何重定向logcat输出?,android,logcat,Android,Logcat,有没有办法将logcat的输出重定向到InputStream或类似的东西?我正在考虑如何在C中重定向stderr。 我想这样做,当我的应用程序启动时,它会被重定向,所有发生的事情都会被转储到文件中。LogCat输出的唯一重定向可能是documentend和 不可能在应用程序本身中重用LogCat输出。但是,您可以按照您的要求进行调试。如果您可以连接设备进行调试,则可以从命令行执行此操作 $ adb logcat > textfile.txt 我找到的最简单的方法是使用System.set

有没有办法将logcat的输出重定向到InputStream或类似的东西?我正在考虑如何在C中重定向stderr。
我想这样做,当我的应用程序启动时,它会被重定向,所有发生的事情都会被转储到文件中。

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 )
    }