1

我计划在 Android 中为与安全相关的消息实现一个日志记录机制。我希望能够在像Log这样的 Android 源代码中使用它类这样的 Android 源代码中使用它,例如SecuLog.log(String msg);

它应在以下方面与普通日志不同

  • 没有 DEBUG、INFO 等级别...
  • 输出应直接进入设备上的文件。例如,一定不需要重定向 Logcat 输出。

由于多个进程应该能够记录与安全相关的消息,因此我在 com.android.util 中使用静态 PrintWriter 实现 LoggingClass 失败了。

static {
    try {
        writer = new PrintWriter("data/secu.log");
    } catch (FileNotFoundException e) {
        Log.e(TAG, "Exception initializing SecuLog.", e);
    }
}

这不起作用,因为 Android 旨在运行多个 dalvik-VM,它们都试图访问给定的文件。所以我需要某种非阻塞文件 I/O。

有没有一种方法可以重用 Android 的任何日志记录机制而无需显式重定向 logcat 输出?

我还能如何实现一个简单的文件日志记录机制,可以从其他所有进程调用?我应该实施日志服务吗?此服务必须是绑定服务还是已启动服务?我必须使用AIDL吗?

4

2 回答 2

0

在对我的问题发表评论后,我选择了以下解决方案:

  • 创建了多个日志文件
  • 每个进程一个文件
  • 使用 processId 作为日志文件的后缀
  • 设计了一个日志查看应用程序,将所有日志放在一起

对于我的日志记录类,我使用了以下代码:

static {
    try {
        File file = new File("data/secu" + android.os.Process.myPid() + ".log");
        file.createNewFile();
        file.setReadable(true, false);
        file.setExecutable(true, false);
        writer = new PrintWriter(file);
    } catch (IOException e) {
        Log.e(TAG, "Exception initializing SecuLog.", e);
    }
}
于 2014-01-08T19:18:15.013 回答
0

这篇文章现在已经很老了。但我最近做了这项工作并想分享它。欢迎提出建议。有多个库可用于此目的,但如果你想自己做,就可以了。

fun log(tag: String?, message: String) {

        try {

            val direct = File("${Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)}/$DIRECTORY_NAME")

            if (!direct.exists()) {
                direct.mkdir()
            }

            val fileNameTimeStamp = "${SimpleDateFormat("dd-MM-yyyy", Locale.getDefault()).format(Date())}"
            val logTimeStamp = SimpleDateFormat("E MMM dd yyyy 'at' hh:mm:ss:SSS aaa", Locale.getDefault()).format(Date())

            val fileName = "$fileNameTimeStamp.html"

            val file = File("${Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)}/$DIRECTORY_NAME" + File.separator + fileName)

            file.createNewFile()

            if (file.exists()) {

                val fileOutputStream = FileOutputStream(file, true)
                //Here I have added a html tag to beautify/highlight the output in file.
                fileOutputStream.write("<p style=\"background:lightgray;\"><strong style=\"background:lightblue;\">&nbsp&nbsp$logTimeStamp :&nbsp&nbsp</strong>&nbsp&nbsp$message</p>".toByteArray())
                fileOutputStream.close()

            }

        } catch (e: Exception) {
            Log.e(TAG, "Error while logging into file : $e")
        }

    }

保留它的 html 文件的目的是在浏览器中打开它并突出显示不同的项目。因为日志搜索和调试很无聊,美化可以减轻精神压力。

输出文件如下所示:

在此处输入图像描述

于 2020-01-17T07:19:02.163 回答