根据当前线程的栈帧信息,打印日志具体的行类方法等信息。使用枚举区分不同日志种类。使用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
}