日志文件在哪里存储使用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的应用程序的日志文件,
- 将您的设备连接到您的Mac
- 在Xcode中,转到窗口 – >设备
- 在设备列表的左上angular,点击连接的设备。
- 在主面板的“安装的应用程序”部分下,单击您运行CocoaLumberjack的应用程序。
- 在“已安装的应用程序”列表的底部,点击齿轮图标,然后点击下载容器。
- 在Finder中,右键单击(显示菜单)保存的.xcappdata文件,然后selectShow Package Contents
- 日志文件保存在
/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>
希望它会有所帮助。