![](https://img.haomeiwen.com/i2140123/5e838059f9861ae5.png)
作为一个码农,我希望有一天面朝大海,没有bug(想想,就算了),然鹅!!!现实是骨感的。
在东财有段时间了,闲暇之余,决定改造下项目中的日志库。这便是此篇文章的由来,下面 说说主角。
既然要做一个日志库并且开源给大家共享,那便需要足够的扩展性,同时要做好简单易用和性能高效。OK!目标已经明确,我要开车啦!
SLog主要四个模块:
模块名称 | 说明 |
---|---|
配置 | 日志库通用配置 |
日志打印机 | 日志数据输出工具 |
格式化工具 | 包装原始日志信息成我们想要的格式 |
缓存管理 | 处理日志缓存文件 |
下面依次介绍:
一、配置
主要是com.weiqi.slog. Settings这个类
//init log
Settings settings = new Settings.Builder()
.context(context)//获取设备信息等写到日志文件头部
.mLogSegment(LogSegment.TWENTY_FOUR_HOURS)//保存日志文件名时间切片 如果缓存日志量大可以使用小时间片
.zoneOffset(ZoneOffset.P0800)//保存日志时区偏移
.timeFormat(SLogConstants.DEFAULT_TIME_FORMAT)//保存日志时间头格式
.isBorder(true)//是否 开启外框
.isThread(true)//是否 打印线程信息
.isStackTrace(true)//是否 打印堆栈跟踪信息 非必要可以关闭 提升性能
.build();
这里基本是设置日志库通用配置参数,注释已经说的很清楚了。
二、日志打印机
在com.weiqi.slog.printer包下有这几个类:
类名 | 说明 |
---|---|
Printer.java | 接口类 |
PrinterSet.java | 接口集合 |
DefaultFilePrinter.java | 默认的文件打印机,实现了日志信息写入SD卡 |
DefaultConsolePrinter.java | 默认的logcat打印机,实现了日志信息logcat中显示 |
1、使用说明:
/**
* 创建一个控制台打印机
*/
Printer consolePrinter = new DefaultConsolePrinter();
/**
* 设置需要的堆栈跟踪信息深度为2层并开启数据自动JSON格式化
*/
consolePrinter.setFormatter(new DefaultConsoleFormatter(3, true));
/**
* 创建一个SD卡文件打印机 设置日志存储地址
* 默认开启 一个文件上限为30的缓存清理工具 你也可以null关闭 或者自定义实现
*/
Printer filePrinter = new DefaultFilePrinter(SDUtils.getLogPath(getApplicationContext()));
filePrinter.setFormatter(new DefaultFileFormatter());
filePrinter.addLevelForFile(new ArrayList<LogLevel>() {//需要写入文件的日志类型 不设置默认全写入日志文件
{
add(LogLevel.WTF);
}
});
/**
* 打印机放入集合
*/
if (BuildConfig.DEBUG) {
SLog.init(settings, consolePrinter, filePrinter);
} else {
SLog.init(settings, filePrinter);//非debug环境 关闭consolePrinter
}
2、代码说明:
(1)、DefaultConsolePrinter.java
@Override
public void println(LogLevel logLevel, String tag, String msg, boolean isBorder,
boolean isThread, boolean isStackTrace, boolean isSync, String
fileSubffix) {
if (mMessageFormatter != null) {//通过信息格式化工具包装日志信息
msg = mMessageFormatter.format(logLevel, tag, msg, isBorder, isThread, isStackTrace);
}
onHandlePrint(logLevel, tag, msg);//logcat输出
}
(2)、DefaultFilePrinter.java
文件打印机实现了同步、和异步两种方式将日志信息写入缓存文件。
同步方式:直接写入缓存文件,线程阻塞;
异步方式:日志加入写队列,通过写线程写入缓存文件,线程非阻塞。(推荐方式)
@Override
public void println(LogLevel logLevel, String tag, String msg, boolean isBorder,
boolean isThread, boolean isStackTrace, boolean isSync, String
fileSubffix) {
if (mLogLevelsForFile != null && !mLogLevelsForFile.contains(logLevel)) {
return;
}
if (mMessageFormatter != null) {
msg = mMessageFormatter.format(logLevel, tag, msg, isBorder, isThread, isStackTrace);
}
onHandlePrint(msg, isSync, fileSubffix);
}
/**
* 实现同步、异步方式写日志
*/
private void onHandlePrint(String msg, boolean isSync, String fileSubffix) {
LogPacket logPacket = new LogPacket(msg, fileSubffix);
if (!isSync) {
if (mWriterRunnable == null) {
synchronized (this) {
LogFileWriterRunnable temp = mWriterRunnable;
if (temp == null) {
temp = new LogFileWriterRunnable(mLogFileHelper);
new Thread(temp).start();
mWriterRunnable = temp;
}
}
}
mWriterRunnable.enqueue(logPacket);
} else {
mLogFileHelper.doPrintln(logPacket);
}
}
三、格式化工具
在com.weiqi.slog.printer包下有这几个类:
类名 | 说明 |
---|---|
MessageFormatter.java | 接口类 |
DefaultFileFormatter.java | 对应在文件打印机中包装日志信息 |
DefaultConsoleFormatter.java | 对应在logcat打印机中包装日志信息 |
DefaultBorderFormatter.java | 用边框包装日志信息 |
1、使用说明:
参考上一节打印机使用说明。实现也比较简单,就不多说了。
四、缓存管理
在com.weiqi.slog.cacher包下有这几个类:
类名 | 说明 |
---|---|
CacheHelper.java | 接口类 |
LogCacheHelper.java | 对应在文件打印机中管理日志缓存文件 |
1、使用说明:
public DefaultFilePrinter(String logDir) {
CacheHelper cacheHelper = new LogCacheHelper(logDir, 30);
init(logDir, cacheHelper);
}
public DefaultFilePrinter(String logDir, CacheHelper cacheHelper) {
init(logDir, cacheHelper);
}
2、代码说明:
通过对日志文件按创建日志从先到后排列,自动删除缓存旧文件,保留最新的30个缓存文件。
五、完结
好啦,到这里就介绍完了,有什么异议或者建议,请提在文章评论区或者github issues
项目地址 点这里
![](https://img.haomeiwen.com/i2140123/795e3d4e4e156bab.png)
【原创出品 未经授权 禁止转载】
【欢迎微友分享转发 禁止公号等未经授权的转载】
网友评论