2014-02-27 129 views
5

首先我一直在閱讀有關CocoaLumberjack一些線程,我一直沒能找到解決這個問題:CocoaLumberjack登錄應用程序崩潰

我使用CocoaLumberjack在我的應用程序日誌。但我想記錄應用程序崩潰。

我已經試過這樣:

void uncaughtExceptionHandler(NSException *exception) { 
    DDLogError(@"CRASH: %@", exception); 
    DDLogError(@"Stack Trace: %@", [exception callStackSymbols]); 
    // Internal error reporting 

    // Send log to SOA 

} 

但我在的appDelegate收到此錯誤,在其他地方行之有效:

Use of undeclared identifier '_cmd'; did you mean 'dcmd'

有沒有另一種方法來做到這一點?

回答

11

_cmd是當前選擇器或正在調用的Objective-C方法的快捷方式。例如,在一個類中實現這樣的方法:

@implementation MDAppController 

- (void)applicationWillFinishLaunching:(NSNotification *)notification { 
    NSLog(@"[%@ %@]", NSStringFromClass([self class]), 
          NSStringFromSelector(_cmd)); 
} 

@end 

它會打印出:

[MDAppController applicationWillFinishLaunching:]

你遇到了問題試圖使用DDLogError()uncaughtExceptionHandler()功能,因爲內它是C函數而不是Objective-C方法,因此_cmd未定義。

您應該使用DDLogCError()而不是DDLogError(),因爲前者旨在用於C函數而不是Objective-C方法。

在C函數
+0

哇,謝謝你的回覆是對的!現在工作完美,錯誤打印在我的日誌:) –

6

沒有隱藏self,並沒有隱藏_cmd,但不要害怕...

也有記錄功能的家庭給你:

#define DDLogCError(frmt, ...) LOG_C_MAYBE(LOG_ASYNC_ERROR, ddLogLevel, LOG_FLAG_ERROR, 0, frmt, ##__VA_ARGS__) 
#define DDLogCWarn(frmt, ...) LOG_C_MAYBE(LOG_ASYNC_WARN, ddLogLevel, LOG_FLAG_WARN, 0, frmt, ##__VA_ARGS__) 
#define DDLogCInfo(frmt, ...) LOG_C_MAYBE(LOG_ASYNC_INFO, ddLogLevel, LOG_FLAG_INFO, 0, frmt, ##__VA_ARGS__) 
#define DDLogCVerbose(frmt, ...) LOG_C_MAYBE(LOG_ASYNC_VERBOSE, ddLogLevel, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__) 

類似NSAssert VS NSCAssert

2

Yeap,你現在應該使用DDLogC *。在下一個版本(2.0)中,DDLogError將適用於Obj-c方法和C函數。

相關問題