1

我正在使用代码将所有 NSLogs 写入文本文件。如何选择只需要写入文件的 NSlog?

  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);
4

3 回答 3

2

您可能想看看Lumberjack,它是一个全面的日志库。

于 2013-03-27T06:29:07.180 回答
2

请看看这可能会有所帮助:

当设备未连接到系统时,将 nslog 输出重定向到文件在场景中很有用,我们需要控制台日志来跟踪一些问题。为了做到这一点,我们添加了一个 NSObject 的单格类 USTLogger 子类:

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 类实现后,我们只需要在文件中需要 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/

于 2015-06-15T09:22:08.767 回答
1

您可以创建两个版本的 NSLog,因为仅使用 NSLog 的 MYLog 将显示在控制台上。第二个 MYLogFile 将调用 NSLog 并写入文件。

所以基本上你需要制作两个宏或方法。

于 2013-03-27T00:48:54.527 回答