example bar ios objective-c logging lumberjack ddfilelogger

ios - bar - Dónde se almacena el archivo de registro usando CocoaLumberjack



uisearchbar swift 4 (7)

Encontré esto como el último:

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

Del código oficial:

Administrador de archivos de registro predeterminado

Todos los archivos de registro se colocan dentro de logsDirectory. Si no se especifica un logsDirectory específico, se utiliza el directorio predeterminado. En Mac, esto está en ~ / Library / Logs /. En iPhone, esto está en ~ / Library / Caches / Logs. Los archivos de registro se denominan "log-.txt", donde uuid es un hexadecimal de 6 caracteres que consta del conjunto [0123456789ABCDEF]. Los archivos de registro archivados se eliminan automáticamente según la propiedad maximumNumberOfLogFiles.

Estoy utilizando CocoaLumberjack logging framework para el registro de iOS. Para almacenar registros en un archivo, utilicé este código.

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

No puedo encontrar dónde se almacena exactamente el archivo de registro generado por este código. Puede alguien ayudarme con este problema ?


Las respuestas aquí no parecen explicar el hecho de que puede haber múltiples archivos de registro. Puede usar la propiedad logFileManager de su instancia DDFileLogger para recorrer la información del archivo. Consulte DDFileLogger.h para conocer los métodos y propiedades públicos. Lo siguiente puede ser de utilidad:

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

Aquí está mi solución para obtener datos de registro (y enviarlos por correo electrónico). Tenga en cuenta que la cantidad predeterminada de archivos de registro es 5 a partir de este escrito.

- (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:@"[email protected]"]]; [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]; } }


Puede controlar dónde está almacenado, por ejemplo, alguna vez lo almaceno en la carpeta de iTunes para una fácil recuperación. Úselo en AppDelegate al configurar el fileLogger:

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


Puede descargar los archivos de registro del dispositivo conectado, o puede enviarlos directamente desde la aplicación. Ambos enfoques se describen a continuación.

Enviar archivos de registro desde la aplicación a través de correo electrónico, en Swift

Escriba esto en la clase donde tiene una referencia a DDFileLogger. Me gustaría poner esto en una clase de registrador personalizado, por ejemplo, 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 } }

Luego, cuando el usuario toca un botón para indicar que desea enviar los registros,

// 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(["[email protected]"]) 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. } }

Esto da como resultado una ventana emergente de correo electrónico compuesto con un archivo adjunto llamado diagnostic.log , que es todos los archivos de registro concatenados juntos.

Gracias especiales: esta es una traducción de Swift de la versión de Objective-C dada por la otra respuesta.

Obtenga archivos de registro del dispositivo directamente, a través del cable USB

Si desea obtener los archivos de registro que creó su aplicación mientras se ejecuta en el dispositivo,

  1. Conecte su dispositivo a su mac
  2. En Xcode, vaya a Ventana -> Dispositivos
  3. En la esquina superior izquierda de la lista de dispositivos, haz clic en el dispositivo conectado.
  4. En el panel principal, en la sección Aplicaciones instaladas, haga clic en la aplicación en la que ejecutó CocoaLumberjack.
  5. En la parte inferior de la lista de Aplicaciones instaladas, haga clic en el ícono de ajustes y luego en Descargar contenedor.
  6. En Finder, haga clic con el botón derecho (mostrar menú) en el archivo .xcappdata guardado y seleccione Mostrar contenido del paquete
  7. Los archivos de registro se guardan en /AppData/Library/Caches/Logs/

El voto positivo sería bueno si esto es útil para ti.


Si está utilizando CocoaLumberjack, tiene DDFileLogger.h y puede exponer el método currentLogFileInfo: que ya se implementó:

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

Luego, puede acceder mediante programación a la ruta del archivo actual con:

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

Que, en mi iPhone, imprimí:

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

tanto para la consola como para el archivo.


Tengo la respuesta

Se almacena en Library / Appication Support / Iphone Simulator / # version no # / applications / # your application # / documents / logs / log-3hex no>


Enviar archivos de registro desde la aplicación a través del correo electrónico, en Objective-C

Código Objective-C :

En tu encabezado:

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

En su implementación:

- (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 protected]"]]; [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]; }

A continuación, le mostramos cómo puede agregar algo en su archivo de registro:

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

No olvides configurar tu ddLogLevel en tu archivo Constants.

Constantes.h:

extern NSUInteger const ddLogLevel;

Comstants.m:

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

Es muy obvio, pero no olvides configurar CocoaLumberjack en tu archivo AppDelegate.m .

[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];

El mejor lugar para pegar este código es - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions; en su archivo AppDelegate.m También debe agregar esta línea de código en su encabezado AppDelegate.m :

#import <CocoaLumberjack/CocoaLumberjack.h>

Espero que ayude