diff options
author | Philip P. Moltmann <moltmann@google.com> | 2020-05-06 17:09:26 -0700 |
---|---|---|
committer | Philip P. Moltmann <moltmann@google.com> | 2020-05-06 18:50:07 -0700 |
commit | b4d14cb193bdc7e8b316283e203aed2b1bfbf590 (patch) | |
tree | 859819c77f3bc800c72eab34815ba1d734dbaef8 /PermissionController/src/com/android/permissioncontroller/DumpableLog.kt | |
parent | bf6b6c97c620831f017c8f3d1f980fe9a2f0aba1 (diff) | |
download | Permission-b4d14cb193bdc7e8b316283e203aed2b1bfbf590.tar.gz |
Dump Auto-revoke logs
- Introduce dumping from PermissionControllerServiceImpl
- Introduce a way to log and also store the logs for dumping later
Test: adb shell dumpsys permissionmgr
Bug: 155680199
Change-Id: I60128c9d027395888e22dc999051911a1fe6a034
Diffstat (limited to 'PermissionController/src/com/android/permissioncontroller/DumpableLog.kt')
-rw-r--r-- | PermissionController/src/com/android/permissioncontroller/DumpableLog.kt | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/PermissionController/src/com/android/permissioncontroller/DumpableLog.kt b/PermissionController/src/com/android/permissioncontroller/DumpableLog.kt new file mode 100644 index 000000000..0b482fcd3 --- /dev/null +++ b/PermissionController/src/com/android/permissioncontroller/DumpableLog.kt @@ -0,0 +1,102 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.permissioncontroller + +import android.util.Log +import com.android.permissioncontroller.Constants.LOGS_TO_DUMP_FILE +import java.io.File +import java.io.PrintWriter + +/** + * Like {@link Log} but stores the logs in a file which can later be dumped via {@link #dump} + */ +object DumpableLog { + private const val MAX_FILE_SIZE = 32 * 1024 + + private val lock = Any() + private val file = File(PermissionControllerApplication.get().filesDir, LOGS_TO_DUMP_FILE) + + init { + file.createNewFile() + } + + /** + * Equivalent to {@link Log.v} + */ + fun v(tag: String, message: String, exception: Exception? = null) { + Log.v(tag, message, exception) + addLogToDump("v", tag, message, exception) + } + + /** + * Equivalent to {@link Log.d} + */ + fun d(tag: String, message: String, exception: Exception? = null) { + Log.d(tag, message, exception) + addLogToDump("d", tag, message, exception) + } + + /** + * Equivalent to {@link Log.i} + */ + fun i(tag: String, message: String, exception: Exception? = null) { + Log.i(tag, message, exception) + addLogToDump("i", tag, message, exception) + } + + /** + * Equivalent to {@link Log.w} + */ + fun w(tag: String, message: String, exception: Exception? = null) { + Log.w(tag, message, exception) + addLogToDump("w", tag, message, exception) + } + + /** + * Equivalent to {@link Log.e} + */ + fun e(tag: String, message: String, exception: Exception? = null) { + Log.e(tag, message, exception) + addLogToDump("e", tag, message, exception) + } + + private fun addLogToDump(level: String, tag: String, message: String, exception: Exception?) { + synchronized(lock) { + // TODO: Needs to be replaced by proper log rotation + if (file.length() > MAX_FILE_SIZE) { + val dump = file.readLines() + + file.writeText("truncated at ${System.currentTimeMillis()}\n") + dump.subList(dump.size / 2, dump.size).forEach { file.appendText(it + "\n") } + } + + file.appendText("${System.currentTimeMillis()} $tag:$level $message " + + "${exception?.let { it.message + Log.getStackTraceString(it) } ?: ""}\n") + } + } + + /** + * Write the previously logged entries to the print writer. + * + * @param pw the writer to dump to + */ + fun dump(pw: PrintWriter) { + synchronized(lock) { + file.forEachLine { pw.println(it) } + } + } +}
\ No newline at end of file |