日志文件在哪里存储使用cocoaLumberjack

我正在使用cocoaLumberjack日志框架进行iOS日志logging。 为了将日志存储在文件中,我使用了这个代码。

DDFileLogger* fileLogger = [[DDFileLogger alloc] init]; fileLogger.rollingFrequency = 60 * 60 * 24; fileLogger.logFileManager.maximumNumberOfLogFiles = 7; [DDLog addLogger:fileLogger]; DDLogVerbose(@"hello"); NSLog(@"hihihihihi"); 

我无法find该代码生成的日志文件的确切位置。 有人可以帮我解决这个问题吗?

这里的答案似乎没有考虑到可能有多个日志文件的事实。 您可以使用您的DDFileLogger实例的logFileManager属性来遍历文件信息。 查看DDFileLogger.h了解公共方法和属性。 以下可能是有用的:

 - (NSString *)logsDirectory; - (NSArray *)unsortedLogFilePaths; - (NSArray *)unsortedLogFileNames; - (NSArray *)unsortedLogFileInfos; - (NSArray *)sortedLogFilePaths; - (NSArray *)sortedLogFileNames; - (NSArray *)sortedLogFileInfos; 

这是我获取日志数据(并通过电子邮件发送)的解决scheme。 请注意,在撰写本文时,默认的日志文件数是5。

 - (NSMutableArray *)errorLogData { NSUInteger maximumLogFilesToReturn = MIN([KRLogManager sharedInstance].fileLogger.logFileManager.maximumNumberOfLogFiles, 10); NSMutableArray *errorLogFiles = [NSMutableArray arrayWithCapacity:maximumLogFilesToReturn]; DDFileLogger *logger = [KRLogManager sharedInstance].fileLogger; NSArray *sortedLogFileInfos = [logger.logFileManager sortedLogFileInfos]; for (int i = 0; i < MIN(sortedLogFileInfos.count, maximumLogFilesToReturn); i++) { DDLogFileInfo *logFileInfo = [sortedLogFileInfos objectAtIndex:i]; NSData *fileData = [NSData dataWithContentsOfFile:logFileInfo.filePath]; [errorLogFiles addObject:fileData]; } return errorLogFiles; } - (void)composeEmailWithDebugAttachment { if ([MFMailComposeViewController canSendMail]) { MFMailComposeViewController *mailViewController = [[MFMailComposeViewController alloc] init]; mailViewController.mailComposeDelegate = self; NSMutableData *errorLogData = [NSMutableData data]; for (NSData *errorLogFileData in [self errorLogData]) { [errorLogData appendData:errorLogFileData]; } [mailViewController addAttachmentData:errorLogData mimeType:@"text/plain" fileName:@"errorLog.txt"]; [mailViewController setSubject:NSLocalizedString(@"Good Subject", @"")]; [mailViewController setToRecipients:[NSArray arrayWithObject:@"some@email.com"]]; [self presentModalViewController:mailViewController animated:YES]; } else { NSString *message = NSLocalizedString(@"Sorry, your issue can't be reported right now. This is most likely because no mail accounts are set up on your mobile device.", @""); [[[UIAlertView alloc] initWithTitle:nil message:message delegate:nil cancelButtonTitle:NSLocalizedString(@"OK", @"") otherButtonTitles: nil] show]; } } 

您可以从连接的设备下载日志文件,也可以直接从应用程序发送。 下面介绍两种方法。

在Swift中通过电子邮件从应用程序发送日志文件

在有DDFileLogger引用的类中写下。 我会把它放在一个自定义的logging器类,例如MyLogger.swift

 var ddFileLogger: DDFileLogger! var logFileDataArray: [NSData] { get { let logFilePaths = ddFileLogger.logFileManager.sortedLogFilePaths() as! [String] var logFileDataArray = [NSData]() for logFilePath in logFilePaths { let fileURL = NSURL(fileURLWithPath: logFilePath) if let logFileData = try? NSData(contentsOfURL: fileURL, options: NSDataReadingOptions.DataReadingMappedIfSafe) { // Insert at front to reverse the order, so that oldest logs appear first. logFileDataArray.insert(logFileData, atIndex: 0) } } return logFileDataArray } } 

然后,当用户点击button以指示他们想要发送日志时,

 // Required by MFMailComposeViewController import MessageUI @IBAction func writeEmailTapped(sender: AnyObject) { if MFMailComposeViewController.canSendMail() { let composeVC = MFMailComposeViewController() composeVC.mailComposeDelegate = self // Configure the fields of the interface. composeVC.setToRecipients(["your-email@company.com"]) composeVC.setSubject("Feedback for app") composeVC.setMessageBody("", isHTML: false) let attachmentData = NSMutableData() for logFileData in MyLogger.sharedInstance.logFileDataArray { attachmentData.appendData(logFileData) } composeVC.addAttachmentData(attachmentData, mimeType: "text/plain", fileName: "diagnostic.log") self.presentViewController(composeVC, animated: true, completion: nil) } else { // Tell user about not able to send email directly. } } 

这会导致邮件popup一个名为diagnostic.log的附件文件,所有的日志文件连接在一起。

特别感谢 – 这是从另一个答案给出的Objective-C版本的Swift翻译。

通过USB线直接从设备获取日志文件

如果您想获取在设备上运行时创build的应用程序的日志文件,

  1. 将您的设备连接到您的Mac
  2. 在Xcode中,转到窗口 – >设备
  3. 在设备列表的左上angular,点击连接的设备。
  4. 在主面板的“安装的应用程序”部分下,单击您运行CocoaLumberjack的应用程序。
  5. 在“已安装的应用程序”列表的底部,点击齿轮图标,然后点击下载容器。
  6. 在Finder中,右键单击(显示菜单)保存的.xcappdata文件,然后selectShow Package Contents
  7. 日志文件保存在/AppData/Library/Caches/Logs/

如果这对你有帮助,那么投票将是很好的!

如果你使用的是CocoaLumberjack,你可以使用DDFileLogger.h,你可以公开已经实现的currentLogFileInfo:方法:

 @interface DDFileLogger : DDAbstractLogger <DDLogger> ... - (DDLogFileInfo *)currentLogFileInfo; @end 

然后,您可以通过编程访问当前文件的path:

 // configure logger DDFileLogger *fileLogger = [DDFileLogger new]; [DDLog addLogger:fileLogger]; [DDLog addLogger:[DDTTYLogger sharedInstance]]; DDLogInfo(@"log file at: %@", [[fileLogger currentLogFileInfo] filePath]); 

哪一个在我的iPhone上打印:

 log file at: /var/mobile/Applications/3BE1219F-78BE-491C-B68C-74D6FA0C2EF1/Library/Caches/Logs/log-5D1286.txt 

到控制台和文件。

您可以控制存储的位置,例如,我可以将其存储在iTunes文件夹中以便于检索。 设置fileLogger时,可以在AppDelegate中使用它:

 NSString * applicationDocumentsDirectory = [[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject] path]; DDLogFileManagerDefault *documentsFileManager = [[DDLogFileManagerDefault alloc] initWithLogsDirectory:applicationDocumentsDirectory]; DDFileLogger *fileLogger = [[DDFileLogger alloc] initWithLogFileManager:documentsFileManager]; 

发现这是最新的:

 DDFileLogger *fileLogger = [[DDFileLogger alloc] init]; fileLogger.logFileManager.logsDirectory;//THIS 

从官方代码:

默认日志文件pipe理器。

所有日志文件都放在logsDirectory中。 如果未指定特定的logsDirectory,则使用默认目录。 在Mac上,这是在〜/ Library / Logs /中。 在iPhone上,这是在〜/库/caching/日志。 日志文件被命名为“log-.txt”,其中uuid是由集合[0123456789ABCDEF]组成的6个字符的hex。 归档日志文件根据maximumNumberOfLogFiles属性自动删除。

得到了答案

它存储在库/应用程序支持/ Iphone模拟器/#版本号#/应用程序/#您的应用程序#/文件/日志/日志-3hex否>

在Objective-C中通过电子邮件从应用程序发送日志文件

Objective-C代码:

在你的头上:

 #import <MessageUI/MessageUI.h> #import "DDLog.h" #import "DDFileLogger.h" 

在你的实现中:

 - (NSMutableArray *)errorLogData { DDFileLogger *ddFileLogger = [DDFileLogger new]; NSArray <NSString *> *logFilePaths = [ddFileLogger.logFileManager sortedLogFilePaths]; NSMutableArray <NSData *> *logFileDataArray = [NSMutableArray new]; for (NSString* logFilePath in logFilePaths) { NSURL *fileUrl = [NSURL fileURLWithPath:logFilePath]; NSData *logFileData = [NSData dataWithContentsOfURL:fileUrl options:NSDataReadingMappedIfSafe error:nil]; if (logFileData) { [logFileDataArray insertObject:logFileData atIndex:0]; } } return logFileDataArray; } - (void)composeEmailWithDebugAttachment { if ([MFMailComposeViewController canSendMail]) { MFMailComposeViewController *mailViewController = [[MFMailComposeViewController alloc] init]; mailViewController.mailComposeDelegate = self; NSMutableData *errorLogData = [NSMutableData data]; for (NSData *errorLogFileData in [self errorLogData]) { [errorLogData appendData:errorLogFileData]; } [mailViewController addAttachmentData:errorLogData mimeType:@"text/plain" fileName:@"filename.log"]; [mailViewController setSubject:NSLocalizedString(@"LogFile Subject", @"")]; [mailViewController setToRecipients:[NSArray arrayWithObject:@"email@email.com"]]; [self presentViewController:mailViewController animated:YES completion:nil]; } else { NSString *message = NSLocalizedString(@"Sorry, your issue can't be reported right now. This is most likely because no mail accounts are set up on your mobile device.", @""); [[[UIAlertView alloc] initWithTitle:nil message:message delegate:nil cancelButtonTitle:NSLocalizedString(@"OK", @"") otherButtonTitles: nil] show]; } } - (void)mailComposeController:(MFMailComposeViewController *)mailer didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error { [self becomeFirstResponder]; [mailer dismissViewControllerAnimated:YES completion:nil]; } 

以下是如何在日志文件中添加内容的方法:

 DDLogError(@"This is an error."); DDLogWarn(@"This is a warning."); DDLogInfo(@"This is just a message."); DDLogVerbose(@"This is a verbose message."); 

不要忘记在常量文件中设置ddLogLevel

Constants.h:

 extern NSUInteger const ddLogLevel; 

Comstants.m:

 NSUInteger const ddLogLevel = #ifdef DEBUG LOG_LEVEL_VERBOSE; #else LOG_LEVEL_ERROR; #endif 

这是非常明显的,但不要忘记在你的AppDelegate.m文件中configurationCocoaLumberjack。

 [DDLog addLogger:[DDASLLogger sharedInstance]]; [DDLog addLogger:[DDTTYLogger sharedInstance]]; DDFileLogger *fileLogger = [[DDFileLogger alloc] init]; [fileLogger setMaximumFileSize:(1024 * 1024)]; [fileLogger setRollingFrequency:(3600.0 * 24.0)]; [[fileLogger logFileManager] setMaximumNumberOfLogFiles:7]; [DDLog addLogger:fileLogger]; 

粘贴这段代码的最好的地方是- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions; 在您的AppDelegate.m文件中。 你也应该在你的AppDelegate.m头文件中添加这行代码:

 #import <CocoaLumberjack/CocoaLumberjack.h> 

希望它会有所帮助。

Interesting Posts