Skip to content

Instantly share code, notes, and snippets.

@Blankj
Last active January 11, 2018 12:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Blankj/20e067a759c7e4420e264fe96b263c0a to your computer and use it in GitHub Desktop.
Save Blankj/20e067a759c7e4420e264fe96b263c0a to your computer and use it in GitHub Desktop.
[How to use XCLog] #XCCommon

Download

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"

Functions

  • 兼容 Kotlin
  • 可设置 Log 开启和关闭
  • 可设置是否输出到控制台(Logcat)
  • 可设置 Log 全局 Tag
  • Tag 为空时 Tag 为当前类名
  • 可设置 Log 是否显示头部信息
  • Log 头部含有当前线程名
  • Log 头部含有当前类及行号和函数名,支持点击跳转
  • 可设置 Log 是否写入文件
  • 可设置 Log 写入文件目录
  • 可设置 Log 写入文件前缀
  • 可设置 Log 是否显示边框
  • 可设置 Log 控制台过滤器
  • 可设置 Log 文件过滤器
  • 可设置 Log 栈深度
  • 支持控制台长字符串的输出
  • 支持多参数输出
  • 支持单独写入文件
  • 支持 JSON 串的输出
  • 支持 XML 串的输出
  • 支持可二次封装的配置

API of Lg

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

Proguard

#Xlog
-keep class com.tencent.mars.** { *; }
-keepclassmembers class com.tencent.mars.** { *; }
-dontwarn com.tencent.mars.**

Introduce

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。

How to view the log

默认生成的日志是经过压缩过的,所以还需要解压,执行 util 下的 decode.py 文件即可,比如要对 ECARX_20170515.xlog 进行解压,我们在终端执行如下命令:

python decode.py ECARX_20170515.xlog

这样便会有 ECARX_20170515.xlog.log 的解压文件出现,其内容便是我们的 log 信息。

TODO

由于 XLog 的 JNI 层输出文件部分信息无用且格式较乱,导致体验不是很好,所以后续我会修改 JNI 部分来达到日志信息的有效性及可观性。

Update Log

  • 2.0.0 修复日志文件等级过滤不对,优化代码(08/01/11)
  • 1.6.1 初始化异步操作
  • 1.6.0 新增 v7 和 64 的 .so,优化代码
  • 1.5.0 初始化设置是否使用 xlog 的参数
  • ... 不断迭代版本
  • 1.0 初始版本
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment