打印日志定位到具体行

47 阅读1分钟

根据当前线程的栈帧信息,打印日志具体的行类方法等信息。使用枚举区分不同日志种类。使用StringBuffer进行字符串拼接;

object Logger {

    fun d(tag:String, msg:String) {
        print(tag, msg, LogLevel.Debug)
    }

    fun i(tag:String, msg:String) {
        print(tag, msg, LogLevel.Info)
    }

    fun e(tag:String, msg:String) {
        print(tag, msg, LogLevel.Error)
    }

    fun w(tag:String, msg:String) {
        print(tag, msg, LogLevel.Warning)
    }

    private fun print(tag:String, msg:String, level: LogLevel) {
        val index = 4
        val stringBuffer = StringBuffer()
        //打印栈帧中的所有方法调用
        try {
            // 获取当前线程的栈帧信息
            val stackTrace = Thread.currentThread().stackTrace
            // 类名
            val className = stackTrace[index].fileName
            // 方法名
            var methodName = stackTrace[index].methodName
            // 行号
            val lineNumber = stackTrace[index].lineNumber
            methodName =
                methodName.substring(0, 1).uppercase(Locale.getDefault()) + methodName.substring(1)
            stringBuffer.append("[(").append(className).append(":").append(lineNumber).append(")#")
                .append(methodName).append("] ")
        } catch (e: Exception) {
            e.printStackTrace()
        }

        val finalMsg = "$stringBuffer: $msg"
        when (level) {
            LogLevel.Info-> {
                Log.i(tag, finalMsg)
            }
            LogLevel.Warning-> {
                Log.w(tag, finalMsg)
            }
            LogLevel.Debug-> {
                Log.d(tag, finalMsg)
            }
            LogLevel.Error -> {
                Log.e(tag, finalMsg)
            }
        }
    }
}

enum class LogLevel {
    Debug,
    Info,
    Error,
    Warning
}