2008-10-14 9 views
17

पर एक फ़ाइल में लॉग इन करना आईफोन एप्लिकेशन में फ़ाइल या डेटाबेस में लॉग स्टेटमेंट लिखने का सबसे अच्छा तरीका क्या होगा?आईफोन

आदर्श रूप से, एनएसएलओजी() आउटपुट को फ्रीपेन() का उपयोग करके फ़ाइल में रीडायरेक्ट किया जा सकता है, लेकिन मैंने कई रिपोर्टें देखी हैं जो यह काम नहीं करती हैं। क्या किसी के पास यह पहले से ही चल रहा है या कोई विचार है कि यह कैसे किया जा सकता है?

धन्यवाद!

उत्तर

18

मैंने अपने स्वयं के फ़ाइल में आउटपुट को फिर से निर्देशित करने के लिए फोन पर फ्रोजन (...) का सफलतापूर्वक उपयोग किया है।

+0

क्या आपको याद है कि आपने किस तर्क का उपयोग किया था? –

+3

मैंने फ्रीपेन ([newFileName UTF8String], "w +", stderr) का उपयोग किया, जिसने सभी कंसोल आउटपुट को लॉगफाइल नाम पर रीडायरेक्ट किया। –

+0

बस पालन करने के लिए - यह ठीक काम किया। एकमात्र बमर यह है कि एनएसएलओजी आउटपुट फ्रीपेन को कॉल करने के बाद कंसोल पर दिखाई देता है, लेकिन यह एक मामूली मामूली मुद्दा है। –

32

यदि आप कोको, एनएसएसटींग और एनएसडाटा का उपयोग करना चाहते हैं तो फ़ाइल को पढ़ने/लिखने के तरीके हैं और NSFileManager आपको फ़ाइल ऑपरेशन देता है। यहाँ एक उदाहरण है (iPhone पर काम करना चाहिए):

NSData *dataToWrite = [[NSString stringWithString:@"String to write"] dataUsingEncoding:NSUTF8StringEncoding]; 

NSString *docsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
NSString *path = [docsDirectory stringByAppendingPathComponent:@"fileName.txt"]; 

// Write the file 
[dataToWrite writeToFile:path atomically:YES]; 

// Read the file 
NSString *stringFromFile = [[NSString alloc] initWithContentsOfFile:path]; 

// Check if file exists 
NSFileManager *fileManager = [NSFileManager defaultManager]; 
[fileManager fileExistsAtPath:path]; // Returns a BOOL  

// Remove the file 
[fileManager removeItemAtPath:path error:NULL]; 

// Cleanup 
[stringFromFile release]; 
[fileManager release]; 
11

इस कोड मेरे लिए काम करता है:

- (void)applicationDidFinishLaunching:(UIApplication *)application { 
#if TARGET_IPHONE_SIMULATOR == 0 
    freopen([@"/tmp/my_logs.txt" fileSystemRepresentation], "w", stderr); 
#endif 
} 
14

इस कोड मेरे लिए अच्छा काम करता है ..

#if TARGET_IPHONE_SIMULATOR == 0 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *logPath = [documentsDirectory stringByAppendingPathComponent:@"console.log"]; 
    freopen([logPath cStringUsingEncoding:NSASCIIStringEncoding],"a+",stderr); 
#endif 

फिर आप प्राप्त कर सकते हैं http://blog.coriolis.ch/2009/01/09/redirect-nslog-to-a-file-on-the-iphone/#more-85

पर उल्लिखित विधि का उपयोग करके आईफोन से लॉग फ़ाइल करें नोट करें कि फ्रीपेन का उपयोग सी को रोक देगा XCODE में काम करना .. हालांकि, किसी कारण से आप कंसोल को एक्सकोड के आयोजक में देख सकते हैं, फिर भी बहुत अच्छा काम करता है।

+1

मैं एक्सकोड मुद्दे के आसपास काम करने में सक्षम हूं लेकिन एक्सकोड द्वारा सेट किए गए मेरे चयन के पर्यावरण चर की जांच करके ऐप एक्सकोड से नहीं चल रहा है, तो केवल रीडायरेक्ट कर रहा है। http://lists.apple.com/archives/xcode-users/2009/Aug/msg00507.html उदाहरण के लिए: 'अगर (getenv ("MY_ENV_VAR") == NULL) {/ * कॉल फ्रीपेन() * /} ' –

3

Cocoa Lumberjack का उपयोग करने पर विचार करें। यह NSLog कार्यक्षमता को प्रतिस्थापित करने के लिए एक हल्का लेकिन लचीला उपयोगिता है। मेरी राय में यह Log4J के समान वर्ग में है, जो कस्टम एपेंडर्स और इसी तरह की अनुमति देता है। उदाहरण के लिए, इसमें एक SQLite लॉगर है।