[TOC]
项目地址:https://github.com/dzl888/Logger.git
-
使用Timber进行logcat控制台的日志输出,示例如下:
Timber.i("开始登录") Timber.w("登录失败") Timber.e(Exception("参数错误")) Timber.e(Exception(), "写文件时出现异常")
使用方式与系统的Log类一样,优点是不需要tag参数,默认会以当前类名作为TAG,也可以自定义tag,如下:
Timber.tag("MyTag").i("Hello")
-
使用Logback进行日志文件保存,并且使用Timber对Logback进行了封装,统一了使用方式,加个 f 即可,示例如下:
Timber.fi("开始登录") Timber.fw("登录失败") Timber.fe("无可用网络") Timber.fe(Exception(), "内存不足")
带 f 的日志会同时输出到控制台和文件, 输出到文件的内容示例如下:
08:14:09 [main] INFO MainActivity:开始登录 10:35:54 [main] WARN MainActivity:登录失败 ```
输出格式为: 日志发生的时间、所在线程、日志级别、TAG、日志内容
fe级别的日志会保存在一个bug.txt文件中, 其他 f 级别的会保存在log.txt文件中,而且会按日期保存每天的文件, 保留30天, 文件总大小限制为600M.
保存位置如下:
- 普通日志:/sdcard/Android/data/应用包名/files/Doucuments/logs/
- BUG日志:/sdcard/Android/data/应用包名/files/Doucuments/bugs/
保存位置优点: 兼容所有设备,不需要读写权限, 缺点:应用卸载时文件就没有了
-
调试模式时输出控制台日志, 正式打包后不输出控制台日志(error级别的日志不受此控制,始终输出), 写文件的日志时,控制台不输出日志,但是日志内容还是会写到文件上.
-
在高版本的Android系统中, 虽然在Locat控制台中看不到release版本的应用的进程(模拟器上高版本也能看到进程, 可能是有root权限),但是log还是可以正常输出的, 我们可以直接使用TAG进行过滤日志 , release版本时,日志开关默认是关的, 可通过如下方法打开
Timber.setLogSwitch(true) // 设置日志开关为开状态(当天有效,第二天自动变成关),注:如果是运行的是Debug版本,则即使这里设置为false,log也会输出 Timber.getLogSwitch() // 获取当前日志开关状态 Timber.logToggle() // 切换日志开关,开变成关,关变成开(当天有效,第二天自动变成关)
release模式也可以看到进程, 配置如下:
android { buildTypes { release { debuggable true } } }
这样配置后,打包release的app也能在logcat看到进程, 但是跟Debug版本没什么区别, 只不过是有一个正式的签名而已, BuildConfig.DEBUG的值也是true, 所以最好不要这么搞。
-
版本最低兼容: API 15(Android4.0.3)
class App: Application() {
override fun onCreate() {
super.onCreate()
Timber.init(this, BuildConfig::class.java) // 注意,这里的BuildConfig要使用自己应用包名下的,不能用其他包名下的
Thread.setDefaultUncaughtExceptionHandler { t, e ->
Timber.fe(e, "未捕捉的异常")
}
}
}
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
fun printLog(view: View) {
if (Timber.getLogSwitch() || BuildConfig.DEBUG) { // 获取当前日志开关状态
Timber.i("当前Log开关是开的,可以输出所有级别日志")
} else {
Timber.e("当前log开关是关的,只能输出error级别日志")
}
// 输出日志到控制台
Timber.v("vvvvv")
Timber.d("ddddd")
Timber.i("iiiii")
Timber.w("wwwww")
Timber.e("eeeee")
// 同时输出日志到控制台和文件
Timber.fi("Hello")
Timber.fe("我是error异常,会写到bug文件中")
Timber.fe(Exception("惨了"))
Timber.fe(Exception("又出异常了"), "不慌,没事")
// Timber.setLogSwitch(true) // 设置日志开关为开状态(当天有效,第二天自动变成关)
Timber.logToggle() // 切换日志开关,开变成关,关变成开(当天有效,第二天自动变成关)
}
}
-
在module的build.gradle中添加依赖
repositories { maven { url 'https://192.168.1.251:8081/content/repositories/android_repositories/'} } dependencies { implementation 'cn.dazhou.android.log:timber:2.0.8' }
-
初始化Timber
Timber.init(application, BuildConfig::class.java) // 建议在Application中初始化. 注意,这里的BuildConfig要使用自己应用包名下的,不能用其他包名下的
-
把aar放入libs目录
-
导出的aar没有依赖传递功能,所以除了添加aar之外还要添加日志库所依赖的库
implementation fileTree(dir: "libs", include: ["*.jar", "*.aar"]) implementation 'org.slf4j:slf4j-api:1.7.30' implementation 'com.github.tony19:logback-android:2.0.0'
-
初始化Timber
Timber.init(application, BuildConfig::class.java) // 建议在Application中初始化. 注意,这里的BuildConfig要使用自己应用包名下的,不能用其他包名下的
此日志框架有一个Bug,就是当天的日志命名是不带日期的,到了第二天才会加上日期,比如文件为bug.txt,这代表是当天的bug文件,第二天如果出现一个新的bug,则bug.txt会被保存为bug_2020_12_08.txt,然后创建一个新的bug.txt保存当天的bug,以此类推。这样的话就会有一个问题,如果第二天不出现bug了,则bug.txt中保存的bug实际为第一天保存的,所以我们没办法区分bug.txt中的bug具体是哪一天的了!!现在的一个解决方案就是在每一个日志输出的时候都带上日期,这样在打开bug.txt看里面的日志时,就能看到日志是什么哪个日期产生的。