Gradle:
// add it in repositories
maven { url 'http://xcserver:8082/nexus/content/repositories/releases/' }
// add it in dependencies
compile "com.ecarx:log:2.0.0"
- 兼容 Kotlin
- 可设置 Log 开启和关闭
- 可设置是否输出到控制台(Logcat)
- 可设置 Log 全局 Tag
- Tag 为空时 Tag 为当前类名
- 可设置 Log 是否显示头部信息
- Log 头部含有当前线程名
- Log 头部含有当前类及行号和函数名,支持点击跳转
- 可设置 Log 是否写入文件
- 可设置 Log 写入文件目录
- 可设置 Log 写入文件前缀
- 可设置 Log 是否显示边框
- 可设置 Log 控制台过滤器
- 可设置 Log 文件过滤器
- 可设置 Log 栈深度
- 支持控制台长字符串的输出
- 支持多参数输出
- 支持单独写入文件
- 支持 JSON 串的输出
- 支持 XML 串的输出
- 支持可二次封装的配置
config : 设置配置
setLogSwitch : 设置 log 总开关
setConsoleSwitch : 设置 log 控制台开关
setGlobalTag : 设置 log 全局tag
setLogHeadSwitch : 设置 log 头部信息开关
setLog2FileSwitch: 设置 log 文件开关
setDir : 设置 log 文件存储目录
setBorderSwitch : 设置 log 边框开关
setConsoleFilter : 设置 log 控制台过滤器
setFileFilter : 设置 log 文件过滤器
setFilePrefix : 设置 log 文件前缀名
setIsSecondWrap : 设置 log 是否二次封装
apply : 应用设置
v : tag 为类名的 Verbose 日志
vTag : 自定义 tag 的 Verbose 日志
d : tag 为类名的 Debug 日志
dTag : 自定义 tag 的 Debug 日志
i : tag 为类名的 Info 日志
iTag : 自定义 tag 的 Info 日志
w : tag 为类名的 Warn 日志
wTag : 自定义 tag 的 Warn 日志
e : tag 为类名的 Error 日志
eTag : 自定义 tag 的 Error 日志
a : tag 为类名的 Assert 日志
aTag : 自定义 tag 的 Assert 日志
file : log 到文件
json : log 字符串之 json
xml : log 字符串之 xml
#Xlog
-keep class com.tencent.mars.** { *; }
-keepclassmembers class com.tencent.mars.** { *; }
-dontwarn com.tencent.mars.**
LogUtils 包含了我们开发人员大部分对日志的操作,因为在写入文件是即时写入,所以效率会很高,但是存在内存的波动,甚至会造成卡顿。
这一点 xlog 无疑是做得最好的,利用 mmap 对文件进行操作从而规避了这一问题,同时,它还支持压缩、加密日志以及对过时日志进行清理的功能(默认 10 天),所以毫无疑问地选择了它。
现在已经集成到了 Lg
中,采用 Lg
的命名考虑到开发人员更简短方便调用,我们只需要在程序入口处初始化即可,参看如下代码。
/**
* 在程序退出时一定要调用 {@link Lg#destroy()} 来将缓冲输出到文件
* <br>如果程序中要强行立马输出到文件,调用 {@link Lg#flush()} 即可
*/
private void initLog() {
Lg.config(this, true)// 第二个参数为是否使用 xlog,默认为 true
.setLogSwitch(BuildConfig.DEBUG)// 设置 log 总开关,包括输出到控制台和文件,默认开
.setConsoleSwitch(BuildConfig.DEBUG)// 设置是否输出到控制台开关,默认开
.setGlobalTag(null)// 设置 log 全局标签,默认为空
// 当全局标签不为空时,我们输出的 log 全部为该 tag,
// 为空时,如果传入的 tag 为空那就显示类名,否则显示 tag
.setLogHeadSwitch(true)// 设置 log 头信息开关,默认为开
.setLog2FileSwitch(false)// 打印 log 时是否存到文件的开关,默认关
.setDir("")// 当自定义路径为空时,写入应用的 /cache/log/ 目录中
.setBorderSwitch(true)// 输出日志是否带边框开关,默认开
.setConsoleFilter(Lg.V)// log 的控制台过滤器,和 logcat 过滤器同理,默认 Verbose
.setFileFilter(Lg.V)// log 文件过滤器,和 logcat 过滤器同理,默认 Verbose
.setFilePrefix("XCCommon")// 设置 log 文件前缀,默认为 "ECARX" ,格式为 "prefix_date.xlog",例如 "ECARX_20170516.xlog"
.setIsSecondWrap(true)// 设置 log 是否二次封装,默认为 false,如果开发人员需要在自己封装的 Log 中调用的话,请设置为 true
.apply();// 2.0.0 以上版本一定要调用 apply
Lg.d(Lg.getConfig());
}
具体在我们应用中遵循如下使用,例如 carlife:
// init it in ur application
private void initECarXLog() {
String packageName = getPackageName();
String xsfCarLifeLogPath = "xsf/log/" + packageName; // 所有日志文件存放到统一根目录下,便于收集,同时按照应用分子目录存放,必要时按应用内功能模块划分
File carlifeLogDir = new File(Environment.getExternalStorageDirectory(), xsfCarLifeLogPath);
Lg.config(this, true) // 第二个参数为是否使用xlog,默认为 true
.setLogSwitch(true)
.setConsoleSwitch(true) // debug版本,仅输出到控制台
.setConsoleFilter(BuildConfig.DEBUG ? Lg.V : Lg.W) // release 版本,warning 及以上级别日志输出到控制台及文件
.setLog2FileSwitch(!BuildConfig.DEBUG) // debug 版本,仅输出到控制台
.setFileFilter(BuildConfig.DEBUG ? Lg.D : Lg.I) // release 版本,info 及以上级别日志保存到文件,
.setLogHeadSwitch(BuildConfig.DEBUG)
.setBorderSwitch(BuildConfig.DEBUG)
.setGlobalTag("EXCarLife")
.setDir(carlifeLogDir.getPath())
.setFilePrefix("CarLife")
.apply();// 2.0.0 以上版本一定要调用 apply
}
如果某些设备报错的话 java.lang.UnsatisfiedLinkError
错误的话,试着在 app 目录下的 build.gradle 尝试如下设置:
defaultConfig {
...
ndk {
abiFilters "armeabi"
}
}
如果以上还是报错的话,说明该设备不支持 xlog,那么就关闭 xlog 的使用,也就是初始化时设置 Lg.config(this, false)...
第二个参数传入 false
即可。
如果想要了解更多,参看 Demo 之 LgActivity。
默认生成的日志是经过压缩过的,所以还需要解压,执行 util
下的 decode.py 文件即可,比如要对 ECARX_20170515.xlog
进行解压,我们在终端执行如下命令:
python decode.py ECARX_20170515.xlog
这样便会有 ECARX_20170515.xlog.log
的解压文件出现,其内容便是我们的 log 信息。
由于 XLog 的 JNI 层输出文件部分信息无用且格式较乱,导致体验不是很好,所以后续我会修改 JNI 部分来达到日志信息的有效性及可观性。
- 2.0.0 修复日志文件等级过滤不对,优化代码(08/01/11)
- 1.6.1 初始化异步操作
- 1.6.0 新增 v7 和 64 的 .so,优化代码
- 1.5.0 初始化设置是否使用 xlog 的参数
- ... 不断迭代版本
- 1.0 初始版本