Как да пренасочите определен NSLog изход към файл

Използвам кода, за да запиша всички NSLogs в текстов файл. Как мога да избера NSlogs, които трябва само да запиша във файл?

  NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                     NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *logPath = [documentsDirectory stringByAppendingPathComponent:@"MOVbandlog.txt"];
//freopen([logPath cStringUsingEncoding:NSASCIIStringEncoding],"a+",stderr);
freopen([logPath fileSystemRepresentation],"a+",stderr);

person TWcode    schedule 27.03.2013    source източник


Отговори (3)


Можете да създадете две версии на NSLog, тъй като MYLog, използващ само NSLog, ще се покаже на конзолата. Втори един MYLogFile, който ще извика NSLog и също ще пише във файл.

Така че основно трябва да направите два макроса или метода.

person Anoop Vaidya    schedule 27.03.2013
comment
Мога ли да получа пример? Ето един от моите NSlogs NSLog(@\n*********данни, получени от устройството********\n%@,[описание на данните]); - person TWcode; 27.03.2013
comment
направете някои корекции тук - person Anoop Vaidya; 27.03.2013
comment
Този ред не работи: fprintf(myFileDescriptor, %s\n, [formattedMessage UTF8String]); Нещо с myfileDescriptor - person TWcode; 27.03.2013

Може да искате да разгледате Lumberjack, което е изчерпателна библиотека за регистриране.

person fumoboy007    schedule 27.03.2013

Моля, вижте това може да помогне:

Пренасочването на изхода на nslog към файл е полезно в сценарии, когато устройството не е свързано към системата и се нуждаем от регистрационните файлове на конзолата, за да проследим някои проблеми. За да направим това, добавихме един сингелтон клас USTLogger подклас на NSObject:

Изходният код за файла USTLogger.h е следният:

#import <Foundation/Foundation.h>

@interface USTLogger : NSObject
{
BOOL stdErrRedirected;
}
@property (nonatomic, assign) BOOL stdErrRedirected;

-(void) writeNSLogToFile;

+ (USTLogger *) sharedInstance;

Изходният код за файла USTLogger.m е следният:

#import "USTLogger.h"
#import <unistd.h>

@implementation USTLogger

@synthesize stdErrRedirected;

static int savedStdErr = 0;
static USTLogger *sharedInstance;

+ (USTLogger *) sharedInstance {
static dispatch_once_t once;
static id sharedInstance;
dispatch_once(&once, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}

-(id)init {
return self;
}

- (void) writeNSLogToFile
{

if (!stdErrRedirected)
{
stdErrRedirected = YES;
savedStdErr = dup(STDERR_FILENO);

NSString *cachesDirectory =  [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)  objectAtIndex:0];
NSString *logPath = [cachesDirectory stringByAppendingPathComponent:@"nslog.log"];
freopen([logPath cStringUsingEncoding:NSASCIIStringEncoding], "a+", stderr);
}
}

- (void)restoreStdErr
{
if (stdErrRedirected)
{
stdErrRedirected = NO;
fflush(stderr);

dup2(savedStdErr, STDERR_FILENO);
close(savedStdErr);
savedStdErr = 0;
}
}

След внедряването на USTLogger Class ние просто трябва да извикаме този метод, когато имаме нужда от nslog във файл

#import "AppDelegate.h"
#import "USTLogger.h"

@interface AppDelegate ()

@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.

[[USTLogger sharedInstance] writeNSLogToFile];

NSLog(@"didFinishLaunchingWithOptions");

return YES;
}
@end

Това ще запише целия nslog изход във файл и той се съхранява в директорията с документи на приложението, можем да получим този nslog файл, като активираме споделянето на файлове за приложението.

изходният код може да бъде изтеглен от връзката по-долу:

https://shankertiwari3.wordpress.com/2015/06/09/redirect-the-nslog-output-to-file-instead-of-console/

person Uma_Shanker_Tiwari    schedule 15.06.2015