测试已测试 | ✗ |
Lang语言 | Obj-CObjective C |
许可证 | MIT |
释放最后发布 | 2015年6月 |
由 Eric Jensen,Neil Bhakta,Ben Cherry 维护。
这是一个使用 NSURLSession 背景传输在文件滚动时上传文件的 CocoaLumberjack 日志文件管理器。它可以与任何接受日志文件作为 HTTP 请求主体的日志聚合服务集成,例如 loggly,amazon S3 或您自己的服务器。
每当有一个文件滚动时,都会重试上传(根据 DDFileLogger 的最大文件大小和滚动频率),直到文件不再可用(根据 DDLogFileManager 的最大日志文件数和磁盘配额)。成功上传后,日志文件将立即从日志目录删除。
兼容 CocoaLumberjack 1.x 或 2.x。使用 PDBackgroundUploadLogFileManager 作为 DDFileLogger 的文件管理器,传递一个模板 NSURLRequest,其主体将被设置为日志文件的内容,并将您应用程序代理的应用程序:handleEventsForBackgroundURLSession:completionHandler:方法委托如下
@interface PDAppDelegate()
@property (strong, nonatomic) PDBackgroundUploadLogFileManager *fileManager;
@end
@implementation PDAppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// WARNING: to minimize battery usage, avoid energy intensive operations such as network requests from controllers
// when launched in UIApplicationStateBackground in response to log uploads until applicationDidBecomeActive
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://:3000/logs"]];
[request setHTTPMethod:@"POST"];
self.fileManager = [[PDBackgroundUploadLogFileManager alloc] initWithUploadRequest:request];
DDFileLogger *fileLogger = [[DDFileLogger alloc] initWithLogFileManager:self.fileManager];
[DDLog addLogger:fileLogger];
return YES;
}
- (void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier completionHandler:(void (^)())completionHandler
{
if ([[self.fileManager sessionIdentifier] isEqualToString:identifier]) {
[self.fileManager handleEventsForBackgroundURLSession:completionHandler];
}
}
上面的方法通过将 URL 替换为来自 https://www.loggly.com/docs/http-bulk-endpoint 的 URL,可以发送纯文本日志到 loggly。要发送原始时间戳得到尊重并可缩放在 loggly UI 中的 JSON 格式日志,也可以使用以下内容
pod 'LogglyLogger-CocoaLumberjack/Formatter'
#import "LogglyFormatter.h"
#import "LogglyFields.h"
[fileLogger setLogFormatter:[[LogglyFormatter alloc] initWithLogglyFieldsDelegate:[LogglyFields new]]];
除非您使用 initWithUploadRequest:discretionary:delegate: 覆盖,否则默认设置所有上传任务的可选标志。根据 NSURLSessionConfiguration,这意味着只有在连接到足够的电量的 Wi-Fi 网络时才会进行上传。因此,从未连接 Wi-Fi 或在连接之前卸载您的应用的用户的任何日志都不会上传,即使实际上连接到 Wi-Fi 的人,他们的日志也将延迟直到他们连接到 Wi-Fi。这对于减少电池和数据使用的日志通常是可接受的权衡。如果您实现了代理协议,您将看到在这种情况下,为了调用具有 Error Domain=NSPOSIXErrorDomain Code=2 "操作无法完成。没有找到文件或目录" 的错误,用户会保持应用但不连接 Wi-Fi 以保留最大日志时间
我们在携带的两台iPhone 5s上运行了我们的应用程序,其中一台安装了这个Pod并把日志上传到Loggly,另一台则没有,几乎是从100%的电量解锁到关闭,以便我们能够隔离后台电池使用(尽管手机的前台使用通常占主导地位)。上传日志和不上传日志之间的差异在噪声范围内:无论是电池寿命还是设置中报告的电池使用,差异都大约是4%。在约6天的时间里,它记录了大约10,000行日志(总共不到2MB)并且可能上传了10次。蜂窝数据使用量相同,证实它确实只在Wi-Fi上上传。
埃里克·詹森,[email protected]
BackgroundUpload-CocoaLumberjack以MIT许可证提供。有关更多信息,请参阅LICENSE文件。
压缩:Loggly不支持压缩,即使是通过Content-Encoding,这似乎是合理的做法。CocoaLumberjack有一个示例,但它不包含在Pod中,DDLogFileManager接口可能应该重构为委托而不是要求继承来发送 didRollAndArchiveLogFile: CompressingLogFileManager