Android自带的日志类不支持显示文件名和行号,调试时很不方便。而第三方日志库往往又太重。所以自己对Android自带的日志类做了一个简单的封装,主要是调试时使用,不考虑日志丢失和性能问题。日志的输出如下:

08-12 13:26:25.557 31285 31285 D com.tq.test: [TestFragment.kt:85 com.tq.test.fragment.TestFragment$subscribeUi$5.onChanged] foo bar

用法如下:

// 在Activity或Fragment中

val someValue = "abc";

getLogger().debug(someValue)

getLogger().debug(someValue, x, y, z)

getLogger().error(ex)

// CrashHandler

package com.tq.test

import android.os.Process

import com.tq.test.utility.Logger

class DefaultExceptionHandler(

private val packageName: String,

private val next: Thread.UncaughtExceptionHandler? = null

): Thread.UncaughtExceptionHandler {

override fun uncaughtException(thread: Thread, error: Throwable) {

val logger = Logger.getLogger(packageName)

logger.error(error, "uncaught exception", thread)

next?.uncaughtException(thread, error)

Process.killProcess(Process.myPid())

}

}

Thread.setDefaultUncaughtExceptionHandler(DefaultExceptionHandler(

getPackageName(),

Thread.getDefaultUncaughtExceptionHandler()

))

源代码如下:

package com.tq.utility

import androidx.appcompat.app.AppCompatActivity

import androidx.fragment.app.Fragment

import android.content.Context

import android.util.Log

class Logger private constructor(val defaultTag: String = "") {

fun debug(vararg values: Any?) = Log.d(defaultTag, makeMessage(values))

fun info(vararg values: Any?) = Log.i(defaultTag, makeMessage(values))

fun warn(vararg values: Any?) = Log.w(defaultTag, makeMessage(values))

fun error(error: Throwable, vararg values: Any?) = Log.e(defaultTag, makeMessage(values), error)

private fun makeMessage(values: Array): String {

// TOOD handle native method

var fileName = "unknown"

var lineNumber = -1

var className = "unknown"

var methodName ="unknown"

val throwable = Throwable()

val stacks = throwable.getStackTrace()

val depth = 2

if (stacks.size > depth) {

val stack = stacks[depth]

fileName = stack.getFileName()

lineNumber = stack.getLineNumber()

className = stack.getClassName()

methodName = stack.getMethodName()

}

val valueString = values.map{ it?.toString() ?: "null" }.joinToString()

return "[$fileName:$lineNumber $className.$methodName] $valueString"

}

companion object {

fun getLogger(tag: String): Logger {

return Logger(tag)

}

fun getLogger(context: Context) = getLogger(context.getPackageName())

}

}

fun AppCompatActivity.getLogger() = Logger.Companion.getLogger(this)

fun Fragment.getLogger() = Logger.Companion.getLogger(activity!!)

Android动态日志,一个简单的Android日志类相关推荐

  1. 使用Android Studio编写一个简单的音乐盒

    文章目录 一.知识要点 二.xml代码 activity_main.xml 三.java代码 MainActivity.java MusicService.java 四.运行界面展示 五. 源码Git ...

  2. Android动态搜索的简单实现

    系列文章目录 Android动态搜索的简单实现 文章最后有源码 文章目录 系列文章目录 前言 一.addTextChangedListener 二.本文案例 1.介绍一下SearchView的一些方法 ...

  3. 一个简单的python日志服务器

    一个简单的python日志服务器,主要目的是搜集各python logging记录的日志,将其简单汇总.源码如下: # -*- coding: utf-8 -*- ''' Created on 201 ...

  4. android实现mysql数据库存储_一个简单的Android端对象代理数据库系统的实现(二、执行+存储)...

    这是我之前在武汉大学彭智勇老师那边做过的一个对象代理数据库系统.文中给出了一整个系统的几乎所有代码,经测试可正常运行.文章比较长,超出了知乎的最长文章范围,因此分为两篇文章.这是第二篇. 执行 执行部 ...

  5. 一个简单的android便签app

    一个简单的android便签app 源码下载 MainActivity.java package com.zp.myfirstapp;import java.io.File; import java. ...

  6. 一个简单的数据库工具类

    为什么80%的码农都做不了架构师?>>>    接上面一片博文,自己弄了一个简单的数据库操作工具类: /** 创建日期 2014-6-5** TODO 要更改此生成的文件的模板,请转 ...

  7. 用java设计实现一个简单的动作冒险类游戏

    用java设计实现一个简单的动作冒险类游戏 1.背景 这是java老师布置的本周作业,具体题目截图如下 2.分析 在UML图已经给出的前提下,此作业很容易.自己在此基础上,加了个简单的界面设计和玩家设 ...

  8. java设计游戏_用java设计实现一个简单的动作冒险类游戏

    用java设计实现一个简单的动作冒险类游戏 1.背景 这是java老师布置的本周作业,具体题目截图如下 2.分析 在UML图已经给出的前提下,此作业很容易.自己在此基础上,加了个简单的界面设计和玩家设 ...

  9. wsm-lucene 一个简单的Lucene工具类

    代码地址: https://gitee.com/shaojiepeng/wsm-lucene wsm-lucene 一个简单的Lucene工具类,通过注释的方式来配置构建索引的字段.提供新建索引.查找 ...

最新文章

  1. cytoscape插件centiscape的使用
  2. python pymysql实例_python笔记-mysql命令使用示例(使用pymysql执行)
  3. Python爬虫入门教程 32-100 B站博人传评论数据抓取 scrapy
  4. 树状数组(Binary Indexed Tree) 总结
  5. CSDN:荣幸获得国内第一大技术社区CSDN 2018博客之星名额!感谢!
  6. 可变数组NSMutableArray
  7. Zookeeper的前世今生
  8. 基于CLGeocoder - 地理编码
  9. ssm中怎么用location.href跳到controller层_聊聊自动驾驶中的功能开发
  10. php怎么循环输出二维数组,PHP中遍历二维数组—以不同形式的输出操作
  11. delphi xe http 收不到反馈消息_好消息!浦东这个小区3幢多层住宅都要加装电梯啦→...
  12. 软件工程专插本_2021年广东专插本8所学校招生专业(拟),华师停招专插本?...
  13. CUDA算法:MS-queue算法相关
  14. 一个mapper接口有多个mapper.xml 文件_MyBatis 源码解析:映射文件的加载与解析(上)
  15. BIM+智慧工地管理平台
  16. C9—Qt实现网络调试助手
  17. 紫光输入法linux,紫光拼音输入法下载_紫光拼音输入法最新版下载-太平洋下载中心...
  18. 使用Windows ADK 创建以U盘引导启动的Windows PE
  19. 帮你举例说明什么是Python鸭子类型
  20. 手把手教你5G时代Webview的正确使用姿势,小白也能看明白

热门文章

  1. log日志java web_Javaweb项目中使用Log4j记录日志
  2. bootstrap4高度占一半_减肥选对了碳水,意味着成功了一半
  3. 大疆Onboard SDK开发中连接飞控后串口设置与开机自启动
  4. 实验吧之【Forms、天网管理系统】
  5. 【转】 UML各种线的含义
  6. Android程序版本更新--通知栏更新下载安装(转)
  7. duilib学习领悟(2)
  8. Esfog_UnityShader教程_NormalMap法线贴图
  9. void readstring( char s[] ); 怎样_char *s和char s[]
  10. java 连接sql_java 连接sql server2008数据库配置