csdn:https://blog.csdn.net/ico10297024/article/details/87277182
美团点评移动端基础日志库——Logan
Logan:美团点评的开源移动端基础日志库
总的来说logan还是个半成品的开源项目,可能美团官方使用的已经是个成品了,但是后台没有开源,所以我们目前只能用他们的前段开源项目来达到本地日志管理的功能;
然后在官网的介绍文章里说了很多高大上的东西,其实说白了最核心的是C语言编写,文件加密,其他说的很多可能是美团内部使用的功能和机制,但并没有开放出来
从目前的sdk来看,只具备几个功能,日志本地存储框架,日志加密,那些日志回捞啥的都没有,就是需要我们自己在程序中实现
卡顿,影响性能(c语言编写)
日志丢失(应该是指因为用c语言编写,底层日志,所以不容易丢失,就是说程序崩溃时,会将缓存区的更改保存到物理文件上。但是查看issues,如果超出文件大小限制,依旧会丢失追加的日志,https://github.com/Meituan-Dianping/Logan/issues/53)
安全性(aes加密)
日志分散(就是有了统一的规则,所有开发者都用这个框架去进行记录,自然就不分散了,另外日志有类型,在sdk方法中,没有筛选的方法)
//初始化
LoganConfig config = new LoganConfig.Builder()
.setCachePath(getApplicationContext().getFilesDir().getAbsolutePath())
.setPath(getApplicationContext().getExternalFilesDir(null).getAbsolutePath()
+ File.separator + "logan_v1")
.setEncryptKey16("0123456789012345".getBytes())
.setEncryptIV16("0123456789012345".getBytes())
.build();
Logan.init(config);
//开启debug模式
Logan.setDebug(true);
//记录日志
Logan.w("test logan", 1);
//将日志从缓存冲刷到物理文件上
//如果未调用该方法程序就崩溃了,框架会将缓存中的内容冲刷到物理文件上
Logan.f();
//获取日志信息,key为日期,value为日志大小
//日志以时间进行分隔存储
Map<String, Long> map = Logan.getAllFilesInfo();
//上传日志,如果对应日期的日志不存在,则SendLogRunnable不会被触发
Logan.s(new String[]{"2019-02-13"}, new SendLogRunnable() {
@Override
public void sendLog(File logFile) {
//在这里编写代码上传到我们自己的服务器上
}
});
/**
返回文件路径+
@param filePatch filePath,nil时表示文件不存在
*/
typedef void (^LoganFilePatchBlock)(NSString *_Nullable filePatch);
/**
logan初始化
@param aes_key16 16位aes加密key
@param aes_iv16 16位aes加密iv
@param max_file 日志文件最大大小,超过该大小后日志将不再被写入,单位:byte。
*/
extern void loganInit(NSData *_Nonnull aes_key16, NSData *_Nonnull aes_iv16, uint64_t max_file);
/**
记录Logan日志
@param type 日志类型
@param log 日志字符串
@brief
用例:
logan(1, @"this is a test");
*/
extern void logan(NSUInteger type, NSString *_Nonnull log);
/**
将日志全部输出到控制台的开关,默认NO
@param b 开关
*/
extern void loganUseASL(BOOL b);
/**
立即写入日志文件
*/
extern void loganFlash(void);
/**
日志信息输出开关,默认NO
@param b 开关
*/
extern void loganPrintClibLog(BOOL b);
/**
清除本地所有日志
*/
extern void loganClearAllLogs(void);
/**
返回本地所有文件名及大小(单位byte)
@return @{@"2018-11-21":@"110"}
*/
extern NSDictionary *_Nullable loganAllFilesInfo(void);
/**
根据日期获取上传日志的文件路径,异步方式!
@param date 日志日期 格式:"2018-11-21"
@param filePatchBlock 回调返回文件路径,在主线程中回调
*/
extern void loganUploadFilePath(NSString *_Nonnull date, LoganFilePatchBlock _Nonnull filePatchBlock);
/**
返回今天日期
@return @"2018-11-21"
*/
extern NSString *_Nonnull loganTodaysDate(void);
关于日志回捞功能,文章说是由推送sdk发起回捞指令,然后logan收到进行上传,这应该是通过后台平台一个按钮来触发,目前后台没有开源,所以这一个功能也是没有的,需要我们自己实现,当然,文章已经给出了思路,至于文章说的logan根据网络类型和日志大小上线选择来节省流量,目前的sdk是通过回调给了我们一个File,需要我们自己来做上传的逻辑,所以也是没有这个功能
关于主动上报功能,可以看到sdk仅仅提供了s方法,也就是说主动上报的触发机制需要根据我们自己app的要求,然后主动调用s方法然后进行上传
https://github.com/Meituan-Dianping/Logan/blob/master/README-zh.md
官方demo中的logan-server有个java文件,这是一个工具,拷贝到我们自己的服务器中然后使用以下代码解析日志文件
new LoganParser(Key16.getBytes(),Iv16.getBytes()).parse(InputStream, OutputStream)
得到明文的日志文件
{"c":"clogan header","f":1,"l":1550048816507,"n":"clogan","i":1,"m":true}
{"c":"test logan","f":1,"l":1550048816497,"n":"main","i":2,"m":true}
下面记录一下每个key的含义
https://github.com/Meituan-Dianping/Logan/wiki/Log-protocol
key | type | description |
---|---|---|
c | string | 日志内容 |
f | int | 日志类型 |
l | long | 时间戳 |
n | string | 线程名称 |
i | int | 线程id |
m | bool | 是不是主线程 |