【问题标题】:Android File LoggingAndroid 文件记录
【发布时间】:2013-11-05 16:04:37
【问题描述】:

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

与普通Log有以下不同

  • 没有 DEBUG、INFO 等级别...
  • 输出应直接进入设备上的 File。例如,一定不需要重定向 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 输出?

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

【问题讨论】:

  • 您要记录的究竟是什么,您自己的应用程序或设备上的所有应用程序?应该只将您发送到YourLogger.log(...) 的日志消息记录到文件中,还是应该让记录器能够“捕获”来自其他地方的日志消息?
  • 我想从 所有 应用程序中记录,并且只记录来自 MyLogger.log(...) 的消息。
  • 来自“所有”应用程序,仅在您编写的应用程序中添加MyLogger.log(...) 到?您希望所有日志消息都转到同一个文件,还是可以是不同的文件?
  • 我希望能够 import MyLogger 并在 Android 源代码的每个 .java 文件中使用其日志记录方法,就像使用普通 Log 类一样。输出应进入一个文件。
  • 这可能比你想象的要困难得多;每个应用程序都有一个独特的日志,以及一个收集和组装所有日志并按时间戳排序的查看工具怎么样?

标签: android logging


【解决方案1】:

在关注我的问题后,我选择了以下解决方案:

  • 创建了多个日志文件
  • 每个进程一个文件
  • 使用 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);
    }
}

【讨论】:

    【解决方案2】:

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

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

    输出文件如下:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-17
      • 1970-01-01
      • 1970-01-01
      • 2016-09-23
      • 2013-12-27
      相关资源
      最近更新 更多