दिलचस्प पोस्ट
वर्तमान गतिविधि का एक स्क्रीनशॉट कैसे लें और फिर इसे साझा करें? कैसे एक छवि अपलोड करें और इसे डेटाबेस में सहेजें? जब एक आइफ्रेम पर मूसमोव का पता लगाया जाए? MySQL में तारीख श्रेणियों के ओवरलैप की जांच करें कन्स्ट्रक्टर एक अशक्त वस्तु वापस कर सकता है? क्यों करता है (यह वास्तव में?) सूची <T> इन सभी इंटरफेस को लागू करें, न केवल IList <T>? C ++ में एक विरल सरणी बनाने का सबसे अच्छा तरीका क्या है? लिनक्स कर्नेल: सिस्टम कॉल hooking उदाहरण स्ट्रिंग आउटपुट: सी # में प्रारूप या कॉन्सैट? ग्राफ्ट बनाम प्रत्यारोपण PHP के साथ सीएसवी फ़ाइल बनाना आईफोन 4 उपयोगकर्ता-एजेंट क्या है? व्यूपोर्ट मेटा टैग का उपयोग करके मोबाइल वेब सामग्री को स्केल करना स्प्रिंग हाइबरनेट टेम्प्लेट का उपयोग कब और क्यों? जावा में गतिरोध का पता लगाने

कैसे एक फाइल में NSLog

क्या प्रत्येक NSLog न केवल कंसोल में लिखना संभव है, लेकिन एक फाइल में भी? मैं NSLog को कुछ someExternalFunctionForLogging में जगह के बिना इसे तैयार करना चाहता हूँ।

सभी NSLog को बदलने की वास्तविक समस्या होगी शायद सांत्वना या संदेशों को पकड़ने से डेटा को पार्स करने की संभावना है?

Solutions Collecting From Web of "कैसे एक फाइल में NSLog"

विकल्प 1: एएसएल का उपयोग करें

एनएसएलॉग ने एएसएल (एसएसओएल के ऐप्पल के संस्करण) और कंसोल पर लॉग इन किया है, जिसका अर्थ है कि जब आप आईफ़ोन सिम्युलेटर का उपयोग करते हैं तो यह पहले से ही आपके मैक में फाइल को लिख रहा है यदि आप इसे पढ़ना चाहते हैं तो एप्लिकेशन कंसोल.app खोलें, और फ़िल्टर फ़ील्ड में अपने एप्लिकेशन का नाम टाइप करें। अपने आईफोन डिवाइस में ऐसा करने के लिए, आपको एएसएल एपीआई का उपयोग करना होगा और कुछ कोडिंग करना होगा।

विकल्प 2: किसी फ़ाइल को लिखें

मान लें कि आप सिम्युलेटर पर चल रहे हैं और आप कंसोल.एप का इस्तेमाल नहीं करना चाहते हैं। आप त्रुटि स्ट्रीम को अपनी पसंद की फ़ाइल में रीप्लोड कर सकते हैं:
freopen([path cStringUsingEncoding:NSASCIIStringEncoding], "a+", stderr);
विवरण के लिए यह विवरण और नमूना प्रोजेक्ट देखें।

या आप एक मैक्रो का उपयोग करके कस्टम फ़ंक्शन के साथ NSLog को ओवरराइड कर सकते हैं। उदाहरण, इस प्रोजेक्ट को अपने प्रोजेक्ट में जोड़ें:

 // file Log.h #define NSLog(args...) _Log(@"DEBUG ", __FILE__,__LINE__,__PRETTY_FUNCTION__,args); @interface Log : NSObject void _Log(NSString *prefix, const char *file, int lineNumber, const char *funcName, NSString *format,...); @end // file Log.m #import "Log.h" @implementation Log void _Log(NSString *prefix, const char *file, int lineNumber, const char *funcName, NSString *format,...) { va_list ap; va_start (ap, format); format = [format stringByAppendingString:@"\n"]; NSString *msg = [[NSString alloc] initWithFormat:[NSString stringWithFormat:@"%@",format] arguments:ap]; va_end (ap); fprintf(stderr,"%s%50s:%3d - %s",[prefix UTF8String], funcName, lineNumber, [msg UTF8String]); [msg release]; } @end 

और इसे अपने <application>-Prefix.pch लिए निम्न में जोड़ने के लिए विस्तृत परियोजना को आयात करें:

 #import "Log.h" 

अब NSLog पर हर कॉल को अपने कस्टम फ़ंक्शन से बदल दिया जाएगा, बिना अपने मौजूदा कोड को छूने की आवश्यकता होगी। हालांकि, उपरोक्त कार्य केवल कंसोल के लिए मुद्रण है। फ़ाइल आउटपुट जोड़ने के लिए, __ॉग पर इस फ़ंक्शन को जोड़ें:

 void append(NSString *msg){ // get path to Documents/somefile.txt NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *path = [documentsDirectory stringByAppendingPathComponent:@"logfile.txt"]; // create if needed if (![[NSFileManager defaultManager] fileExistsAtPath:path]){ fprintf(stderr,"Creating file at %s",[path UTF8String]); [[NSData data] writeToFile:path atomically:YES]; } // append NSFileHandle *handle = [NSFileHandle fileHandleForWritingAtPath:path]; [handle truncateFileAtOffset:[handle seekToEndOfFile]]; [handle writeData:[msg dataUsingEncoding:NSUTF8StringEncoding]]; [handle closeFile]; } 

और _Log फ़ंक्शन में इस रेखा को नीचे fprintf जोड़ें:

 append(msg); 

फाइलिंग आपके आईफोन डिवाइस में भी काम करती है, लेकिन फाइल उसमें एक डायरेक्टरी में बनाई जाएगी, और जब तक आप इसे अपने मैक पर वापस भेजने के लिए कोड नहीं जोड़ते हैं, या इसे आपके दृश्य के अंदर दिखाने में सक्षम नहीं होंगे ऐप, या दस्तावेज निर्देशिका जोड़ने के लिए iTunes का उपयोग करें।

एक बहुत आसान दृष्टिकोण है यहां एक तरीका है जो NSLog आउटपुट को फाइल के Documents फ़ोल्डर में पुनर्निर्देशित करता है। यह उपयोगी हो सकता है जब आप अपने ऐप को अपने विकास स्टूडियो के बाहर का परीक्षण करना चाहते हैं, अपने मैक से अनप्लग किए गए हैं।

ObjC:

 - (void)redirectLogToDocuments { NSArray *allPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [allPaths objectAtIndex:0]; NSString *pathForLog = [documentsDirectory stringByAppendingPathComponent:@"yourFile.txt"]; freopen([pathForLog cStringUsingEncoding:NSASCIIStringEncoding],"a+",stderr); } 

स्विफ्ट:

 func redirectLogToDocuments() { let allPaths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) let documentsDirectory = allPaths.first! let pathForLog = documentsDirectory.stringByAppendingString("/yourFile.txt") freopen(pathForLog.cStringUsingEncoding(NSASCIIStringEncoding)!, "a+", stderr) } 

इस पद्धति को निष्पादित करने के बाद NSLog (ObjC) या print (स्विफ्ट) द्वारा उत्पन्न सभी आउटपुट निर्दिष्ट फाइल को अग्रेषित किया जाएगा। अपनी सहेजी गई फ़ाइल को ओपन Organizer प्राप्त करने के लिए, एप्लिकेशन की फाइलों को ब्राउज़ करें और अपनी फाइल सिस्टम में एपरेक्ट Application Data कहीं से बचाएं, बस Documents फ़ोल्डर को ब्राउज़ करें।

मुझे समस्या का सरल समाधान मिला: iPhone पर एक फ़ाइल में प्रवेश करना किसी भी NSLog कोड को बदलने या लॉगर को बदलने की कोई आवश्यकता नहीं है, बस अपने didFinishLaunchingWithOptions में इन 4 पंक्तियों को जोड़ें और अपनी बिल्ड सेटिंग में यह सुनिश्चित करें कि लाइव रिलीज़ यह सक्रिय नहीं होगा (मैंने इसके लिए LOG2FILE फ़्लैग जोड़ा है)।

 #ifdef LOG2FILE #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 #endif 

जैकेल का उत्तर स्विफ्ट में अनुवाद किया गया, इसे किसी भी मामले में पोस्ट करना किसी और के लिए भी इसकी आवश्यकता है

इस ऐप को कहीं भी अपने ऐप में चलाएं, उस समय से यह सभी एनएसएलॉग () आउटपुट को एक फाइल में स्टोर करता है, दस्तावेज की निर्देशिका में।

 let docDirectory: NSString = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0] as NSString let logpath = docDirectory.stringByAppendingPathComponent("YourFileName.txt") freopen(logpath.cStringUsingEncoding(NSASCIIStringEncoding)!, "a+", stderr) 

अतिरिक्त: Xcode के साथ लॉग फाइल को कैसे खोजें:
आप बस एक्सोड से लॉग ऑन कर सकते हैं: विंडोज> डिवाइसेज> अपना ऐप चुनें> इन्फोहेलेबटन> कंटेनर डाउनलोड करें खोजक के साथ फ़ाइल देखें: फ़ाइल पर दायां माउस बटन क्लिक करें> पैकेज सामग्री दिखाएं> ऐपडाटा> दस्तावेज़> और वहां फ़ाइलें हैं

ठीक! सबसे पहले, मैं इवान-मुल्व्स्की को धन्यवाद देना चाहता हूं यह मेरा समाधान है, शायद यह किसी के लिए सहायक होगा:

AppDelegate में मैं फ़ंक्शन जोड़ें:

 void logThis(NSString* Msg, ...) { NSArray* findingMachine = [Msg componentsSeparatedByString:@"%"]; NSString* outputString = [NSString stringWithString:[findingMachine objectAtIndex:0]]; va_list argptr; va_start(argptr, Msg); for(int i = 1; i < [findingMachine count]; i++) { if ([[findingMachine objectAtIndex:i] hasPrefix:@"i"]||[[findingMachine objectAtIndex:i] hasPrefix:@"d"]) { int argument = va_arg(argptr, int); /* next Arg */ outputString = [outputString stringByAppendingFormat:@"%i", argument]; NSRange range; range.location = 0; range.length = 1; NSString* tmpStr = [[findingMachine objectAtIndex:i] stringByReplacingCharactersInRange:range withString:@""]; outputString = [outputString stringByAppendingString:tmpStr]; } else if ([[findingMachine objectAtIndex:i] hasPrefix:@"@"]) { id argument = va_arg(argptr, id); // add argument and next patr of message outputString = [outputString stringByAppendingFormat:@"%@", argument]; NSRange range; range.location = 0; range.length = 1; NSString* tmpStr = [[findingMachine objectAtIndex:i] stringByReplacingCharactersInRange:range withString:@""]; outputString = [outputString stringByAppendingString:tmpStr]; } else if ([[findingMachine objectAtIndex:i] hasPrefix:@"."]) { double argument = va_arg(argptr, double); // add argument and next patr of message outputString = [outputString stringByAppendingFormat:@"%f", argument]; NSRange range; range.location = 0; range.length = 3; NSString* tmpStr = [[findingMachine objectAtIndex:i] stringByReplacingCharactersInRange:range withString:@""]; outputString = [outputString stringByAppendingString:tmpStr]; } else if ([[findingMachine objectAtIndex:i] hasPrefix:@"f"]) { double argument = va_arg(argptr, double); // add argument and next patr of message outputString = [outputString stringByAppendingFormat:@"%f", argument]; NSRange range; range.location = 0; range.length = 1; NSString* tmpStr = [[findingMachine objectAtIndex:i] stringByReplacingCharactersInRange:range withString:@""]; outputString = [outputString stringByAppendingString:tmpStr]; } else { outputString = [outputString stringByAppendingString:@"%"]; outputString = [outputString stringByAppendingString:[findingMachine objectAtIndex:i]]; } } va_end(argptr); NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES); NSString * filePath = [[paths objectAtIndex:0]stringByAppendingPathComponent:@"logFile.txt"]; NSError* theError = nil; NSString * fileString = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:&theError]; if (theError != nil||[fileString length]==0) { fileString = [NSString stringWithString:@""]; } fileString = [fileString stringByAppendingFormat:@"\n%@",outputString]; if(![fileString writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:&theError]) { NSLog(@"Loging problem"); } NSLog(@"%@",outputString); } 

और, तब "सभी के लिए बदलें" का प्रयोग करें NSLog -> logThis यह कोड मेरे ऐप के लिए अनुकूलित है यह विभिन्न आवश्यकताओं के लिए विस्तारित किया जा सकता है


मदद के लिए thnks

यह वह है जो मैं उपयोग करता हूं और अच्छी तरह काम करता हूं:

http://parmanoir.com/Redirecting_NSLog_to_a_file

आशा करता हूँ की ये काम करेगा।

मैं इसे सामग्री के लिए यहां पोस्ट करूंगा

 - (BOOL)redirectNSLog { // Create log file [@"" writeToFile:@"/NSLog.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil]; id fileHandle = [NSFileHandle fileHandleForWritingAtPath:@"/NSLog.txt"]; if (!fileHandle) return NSLog(@"Opening log failed"), NO; [fileHandle retain]; // Redirect stderr int err = dup2([fileHandle fileDescriptor], STDERR_FILENO); if (!err) return NSLog(@"Couldn't redirect stderr"), NO; return YES; } 

स्विफ्ट 2.0:

ऐड अपिलेगेट करने के लिए इन्हें जोड़ें FinishLaunchWithOptions।

 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { var paths: Array = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) let documentsDirectory: String = paths[0] let logPath: String = documentsDirectory.stringByAppendingString("/console.log") if (isatty(STDERR_FILENO) == 0) { freopen(logPath, "a+", stderr) freopen(logPath, "a+", stdin) freopen(logPath, "a+", stdout) } print(logPath) return true } 

Console.log एक्सेस कर रहा है:

जब लॉग पथ Xcode लॉग एरिया पर मुद्रित होता है, पथ का चयन करें, राइट क्लिक करें, फाइंडर में सेवाएं- रीवायल चुनें और फ़ाइल को खोलें console.log

मैंने एल्विन जॉर्ज के उत्तर के साथ थोड़ा काम किया

लॉग फ़ाइल आकार को नियंत्रण में रखने के लिए मैंने "त्वरित लॉग" फ़ाइलों की "10 पीढ़ियों" (त्वरित और गंदे) समाधान लागू किया है और उन्हें बाद में हटाने के लिए एक फ़ंक्शन जोड़ें

हर बार ऐप शुरू होता है, यह एक सूचकांक "0" के साथ एक नया लॉग फ़ाइल उत्पन्न करेगा। एक्सिसिंग फाइल (एस) का नाम बदलकर एक सूचकांक के साथ बदल दिया जाएगा। सूचकांक "10" हटा दिया जाएगा।

इसलिए, प्रत्येक शुरुआत आपको एक नई लॉग फाइल देती है, अधिकतम 10 पीढ़ियां

यह करने के लिए सबसे खूबसूरत तरीका नहीं हो सकता है, लेकिन पिछले हफ्तों के दौरान मेरे लिए अच्छा काम करता है, क्योंकि मुझे मैक से कुछ समय तक लॉगिंग की आवश्यकता है "

  // ----------------------------------------------------------------------------------------------------------- // redirectConsoleToFile() // // does two things // 1) redirects "stderr", "stdin" and "stdout" to a logfile // 2) deals with old/existing files to keep up to 10 generations of the logfiles // tested with IOS 9.4 and Swift 2.2 func redirectConsoleToFile() { // Instance of a private filemanager let myFileManger = NSFileManager.defaultManager() // the path of the documnts directory of the app let documentDirectory: String = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first! // maximum number of logfiles let maxNumberOfLogFiles: Int = 10 // look if the max number of files already exist var logFilePath : String = documentDirectory.stringByAppendingString("/Console\(maxNumberOfLogFiles).log") var FlagOldFileNoProblem: Bool = true if myFileManger.fileExistsAtPath(logFilePath) == true { // yes, max number of files reached, so delete the oldest one do { try myFileManger.removeItemAtPath(logFilePath) } catch let error as NSError { // something went wrong print("ERROR deleting old logFile \(maxNumberOfLogFiles): \(error.description)") FlagOldFileNoProblem = false } } // test, if there was a problem with the old file if FlagOldFileNoProblem == true { // loop over all possible filenames for i in 0 ..< maxNumberOfLogFiles { // look, if an old file exists, if so, rename it with an index higher than before logFilePath = documentDirectory.stringByAppendingString("/Console\((maxNumberOfLogFiles - 1) - i).log") if myFileManger.fileExistsAtPath(logFilePath) == true { // there is an old file let logFilePathNew = documentDirectory.stringByAppendingString("/WayAndSeeConsole\(maxNumberOfLogFiles - i).log") do { // rename it try myFileManger.moveItemAtPath(logFilePath, toPath: logFilePathNew) } catch let error as NSError { // something went wrong print("ERROR renaming logFile: (i = \(i)), \(error.description)") FlagOldFileNoProblem = false } } } } // test, if there was a problem with the old files if FlagOldFileNoProblem == true { // No problem so far, so try to delete the old file logFilePath = documentDirectory.stringByAppendingString("/Console0.log") if myFileManger.fileExistsAtPath(logFilePath) == true { // yes, it exists, so delete it do { try myFileManger.removeItemAtPath(logFilePath) } catch let error as NSError { // something went wrong print("ERROR deleting old logFile 0: \(error.description)") } } } // even if there was a problem with the files so far, we redirect logFilePath = documentDirectory.stringByAppendingString("/Console0.log") if (isatty(STDIN_FILENO) == 0) { freopen(logFilePath, "a+", stderr) freopen(logFilePath, "a+", stdin) freopen(logFilePath, "a+", stdout) displayDebugString(DEBUG_Others, StringToAdd: "stderr, stdin, stdout redirected to \"\(logFilePath)\"") } else { displayDebugString(DEBUG_Others, StringToAdd: "stderr, stdin, stdout NOT redirected, STDIN_FILENO = \(STDIN_FILENO)") } } // ----------------------------------------------------------------------------------------------------------- // cleanupOldConsoleFiles() // // delete all old consolfiles func cleanupOldConsoleFiles() { // Instance of a private filemanager let myFileManger = NSFileManager.defaultManager() // the path of the documnts directory of the app let documentDirectory: String = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first! // maximum number of logfiles let maxNumberOfLogFiles: Int = 10 // working string var logFilePath: String = "" // loop over all possible filenames for i in 0 ... maxNumberOfLogFiles { // look, if an old file exists, if so, rename it with an index higher than before logFilePath = documentDirectory.stringByAppendingString("/Console\(i).log") if myFileManger.fileExistsAtPath(logFilePath) == true { // Yes, file exist, so delete it do { try myFileManger.removeItemAtPath(logFilePath) } catch let error as NSError { // something went wrong print("ERROR deleting old logFile \"\(i)\": \(error.description)") } } } }