如何重定向logcat输出?

7

有没有一种方法可以将logcat的输出重定向到InputStream或类似的东西? 我想到了类似于在C中如何重定向stderr的内容。

我想在我的应用程序启动时重定向它,以便发生的所有事情都被转储到文件中。


请点击此处查看:http://www.helloandroid.com/tutorials/reading-logs-programatically,如果获得适当的权限,则可以读取日志。 - Korniltsev Anatoly
5个回答

7
如果您可以连接设备进行调试,您可以从命令行执行此操作。
$ adb logcat > textfile.txt

这会持续多久?我的意思是,如果我重新启动设备,它是否仍然会被重定向? - Moises Jimenez
不会,只要“adb”处于活动状态,它就会重定向。在重新启动时,“adb”协议不起作用,因此此时不会进行重定向。 - Royston Pinto
@rodkarom 不,adb 在您重新启动时会断开连接,但您可以在重新启动后重新开始或将其发送到不同的文件。 - spatulamania
如果设备从USB上拔出,那么logcat也会关闭吗?@spatulamania - gumuruh

3
我发现最简单的方法是使用System.setErr。它可以轻松地将错误输出重定向到文件中。
示例:
System.setErr(new PrintStream(new File("<file_path>"))

2
这将仅捕获打印到 System.err 的输出(如果以相同方式重定向,则可能还包括 System.out)。但是,输出将不包括 Android 在每行前缀中添加的内容(时间戳、PID、TID 等),并且通过 Log 类记录的任何内容也不会在此处重定向。 - user149408
你怎么将日志重定向到文件,使用Log.e()运行一些崩溃,然后读取文件? - Phlip

1

LogCat输出的唯一重定向可能性是在此处文档这里中记录。

无法在应用程序本身中重复使用LogCat输出。但是,您可以像您所要求的那样将其导出到文件


0

如果想要仅过滤您的应用程序的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) {

        }

1
可能有更简单的方法:在不使用su并且不授予应用程序READ_LOGS权限的情况下运行logcat,这将限制返回给调用方UID(即您的应用程序,包括早期实例和子进程)的条目。但这似乎因Android发行版而异。否则,logcat还具有-e选项,可以按正则表达式进行过滤。 - user149408

0
在 Kotlin 中,我使用了以下代码,它似乎可以创建并记录到 logcat.txt 文件中(位于应用程序目录中),无论应用程序是在调试还是直接从平板电脑运行。 (顺便说一句:由于某种原因,该目录在文件资源管理器中不会刷新或显示,直到我停止应用程序并重新连接设备。)(感谢之前的贡献者提供的帮助)
   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 )
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接