Logan是美团点评集团移动端基础日志组件。名称是Log和An的组合,代表个体日志服务,同时也是金刚狼大叔的大名。
Logan 承载着各种日志的聚合、存储、分析,作为基础日志库,Logan 已经接入了集团众多日志系统,例如端到端日志、用户行为日志、代码级日志、崩溃日志等。
如果你想编译源代码,请确保NDK版本不高于16.1.4479499。
在项目的build.gradle
文件中添加:
compile 'com.dianping.android.sdk:logan:1.2.2'
在使用之前,必须初始化Logan,例如:
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);
初始化之后,就可以愉快的写日志了,例如这样写一条日志:
Logan.w("test logan", 1);
Logan.w方法有两个参数,详解如下:
- String log:写入的日志内容;
- int type:写入的日志类型,这非常重要,在下文的最佳实践内容会详细讲述如何优雅利用日志类型参数。
如果你想立即写入日志文件,需要调用flush方法:
Logan.f();
如果你想查看所有日志文件的信息,需要调用getAllFilesInfo方法:
Map<String, Long> map = Logan.getAllFilesInfo();
其中key为日期,value为日志文件大小(Bytes)。
Logan内部提供了日志上传机制,对需要上传的日志做了预处理操作。如果你需要上传日志功能,首先需要实现一个自己的SendLogRunnable:
public class RealSendLogRunnable extends SendLogRunnable {
@Override
public void sendLog(File logFile) {
// logFile为预处理过后即将要上传的日志文件
// 在此方法最后必须调用finish方法
finish();
if (logFile.getName().contains(".copy")) {
logFile.delete();
}
}
}
注意:在sendLog方法的最后必须调用finish方法。如上面代码所示。
最后需要调用Logan的send方法:
Logan.s(date, mSendLogRunnable);
其中第一个参数为日期数组(yyyy-MM-dd)。
如果你需要上传日志到服务器,需要申请 INTERNET 权限。
如果你需要写日志到外部存储,或者从外部存储读取日志信息,则需要 WRITE_EXTERNAL_STORAGE 权限或者 READ_EXTERNAL_STORAGE 权限。
Logan支持以CocoaPods方式将Logan库引入到项目中。
在Xcode项目中引入Logan,podfile
添加Logan。
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
target 'TargetName' do
pod 'Logan', '~> 1.2.5'
end
然后运行以下命令:
$ pod install
在使用之前,必须初始化Logan,例如:
#import "Logan.h"
NSData *keydata = [@"0123456789012345" dataUsingEncoding:NSUTF8StringEncoding];
NSData *ivdata = [@"0123456789012345" dataUsingEncoding:NSUTF8StringEncoding];
uint64_t file_max = 10 * 1024 * 1024;
// logan初始化,传入16位key,16位iv,写入文件最大大小(byte)
loganInit(keydata, ivdata, file_max);
#if DEBUG
loganUseASL(YES);
#endif
写入一条日志:
logan(1, @"this is a test");
方法有两个参数,详解如下:
- String log:写入的日志内容;
- int type:写入的日志类型,这非常重要,在下文的最佳实践内容会详细讲述如何优雅利用日志类型参数。
如果你想立即写入日志文件,需要调用flush方法:
loganFlush();
如果你想查看所有日志文件的信息,需要调用getAllFilesInfo方法:
NSDictionary *map = loganAllFilesInfo();
其中key为日期,value为日志文件大小(Bytes)。
Logan提供了获取日志文件方法,对需要上传的日志做了预处理操作。实现网络上传功能就可以日志上传。
loganUploadFilePath(loganTodaysDate(), ^(NSString *_Nullable filePatch) {
if (filePatch == nil) {
return;
}
NSString *urlStr = @"http://127.0.0.1:3000/logupload";
NSURL *url = [NSURL URLWithString:urlStr];
NSMutableURLRequest *req = [[NSMutableURLRequest alloc] initWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:60];
[req setHTTPMethod:@"POST"];
[req addValue:@"binary/octet-stream" forHTTPHeaderField:@"Content-Type"];
NSURL *fileUrl = [NSURL fileURLWithPath:filePatch];
NSURLSessionUploadTask *task = [[NSURLSession sharedSession] uploadTaskWithRequest:req fromFile:fileUrl completionHandler:^(NSData *_Nullable data, NSURLResponse *_Nullable response, NSError *_Nullable error) {
if (error == nil) {
NSLog(@"upload success");
} else {
NSLog(@"upload failed. error:%@", error);
}
}];
[task resume];
});
将Logan/parser-java 拷贝到项目中。
解析日志数据
new LoganParser(Key16.getBytes(),Iv16.getBytes()).parse(InputStream, OutputStream)
请参考 Example/Logan-Server/server.js 实现。
在Logan面世之前,日志系统是相对分散的。
简单来说,传统的思路是通过搜集散落在各系统的日志拼凑出问题出现的场景,而新的思路是从用户产生的所有日志中聚合分析,寻找出现问题的场景。
Logan核心体系由四大模块构成:
- 日志输入
- 日志存储
- 后端系统
- 前端系统
新的个案分析流程如下:
未来我们会提供基于Logan大数据的数据平台,包含机器学习、疑难日志解决方案、大数据特征分析等高级功能。
最后,我们希望提供更加完整的一体化个案分析生态系统。
Module | Open Source | Processing | Planning |
---|---|---|---|
iOS & macOS | √ | ||
Android | √ | ||
Web | √ | ||
Mini Programs | √ | ||
Back End | √ | ||
Front End | √ |
关于贡献PRs和issue的更多信息,请参考贡献指南
-
白帆 - 核心开发者 - baitian0521
-
曹立成 - 核心开发者 - Richard-Cao
-
姜腾 - 核心开发者 - jiangteng
-
杨向南 - 核心开发者 - yangxiangnan
-
马小军 - 核心开发者 - Mr-xiaojun
Logan项目采用MIT许可协议 - 详细内容请查看LICENSE。