BackgroundUpload-CocoaLumberjack 0.3.4

BackgroundUpload-CocoaLumberjack 0.3.4

测试已测试
Lang语言 Obj-CObjective C
许可证 MIT
释放最后发布2015年6月

Eric JensenNeil BhaktaBen Cherry 维护。



  • 作者
  • Eric Jensen

这是一个使用 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];
    }
}

Loggly 集成

上面的方法通过将 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