1 问题背景
公司APP的日志系统全面改用了腾讯开源项目Mars中的xlog日志系统。由于模块化开发,APP中不同的模块由不同的团队进行开发与维护。为了定位不同模块中的Bug,各模块及主工程都接入了xlog。
在一次定位Bug的过程中,发现主工程的本地日志文件记录不全,个别模块甚至丢失了日志文件。经过排查发现是各模块及主工程都使用了com.tencent.mars.xlog.Log的i、d、v、e、w静态方法记录日志,这几个静态方法又调用了com.tencent.mars.xlog.Log.LogImp接口的logX方法,而com.tencent.mars.xlog.Log.LogImp接口的实现类在xlog初始化的时候就注入了com.tencent.mars.xlog.Log。各个模块及主工程都进行xlog的初始化,导致com.tencent.mars.xlog.Log中的com.tencent.mars.xlog.Log.LogImp接口实现类不断被覆盖,最终导致整个APP的xlog异常,记录日志不全。
2 解决方案
根据Mars项目的官方文档,在com.tencent.mars.xlog.Xlog中有一个静态内部类XLogConfig,用于xlog的相关配置,如日志文件路径、日志同步方式、文件名前缀等。
//init xlog
Xlog.XLogConfig logConfig = new Xlog.XLogConfig();
logConfig.mode = Xlog.AppednerModeAsync;
logConfig.logdir = logPath;
logConfig.nameprefix = logFileName;
logConfig.pubkey = "";
logConfig.compressmode = Xlog.ZLIB_MODE;
logConfig.compresslevel = 0;
logConfig.cachedir = "";
logConfig.cachedays = 0;
if (BuildConfig.DEBUG) {
logConfig.level = Xlog.LEVEL_VERBOSE;
Xlog.setConsoleLogOpen(true);
} else {
logConfig.level = Xlog.LEVEL_INFO;
Xlog.setConsoleLogOpen(false);
}
com.tencent.mars.xlog.Xlog中有一个newXlogInstance(XLogConfig xLogConfig)方法,传入XLogConfig实例对象,即可创建出一个新的xlog实例对象,实现xlog的多实例化。
xlog = new Xlog();
logInstancePtr = xlog.newXlogInstance(xLogConfig);
各个模块及主工程中使用com.tencent.mars.xlog.Xlog的logX(long logInstancePtr, String tag, String filename, String funcname, int line, int pid, long tid, long maintid, String log)方法,传入新的xlog实例对象logInstancePtr,即可记录日志。由于各模块及主工程中使用的xlog都是各自新创建的实例对象,因此不存在xlog配置被覆盖的情况,问题得以解决。
参考: