iOSにおけるNSLog出力制御タイミングの詳細
-(void)saveDEBUGlog{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentDirectory = [paths objectAtIndex:0];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy_MM_dd_HH_mm_ss"];
NSString *currentDateStr = [dateFormatter stringFromDate:[NSDate date]];
NSString *fileName = [NSString stringWithFormat:@"testLog_%@.log",currentDateStr];
NSString *logFilePath = [documentDirectory stringByAppendingPathComponent:fileName];
//
NSFileManager *defaultManager = [NSFileManager defaultManager];
[defaultManager removeItemAtPath:logFilePath error:nil];
// log
freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding], "a+", stdout);
freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding], "a+", stderr);
}
この方法は主にfreopenを呼び出す方法であり、stdoutとstderがiOSのほとんどの異常出力を網羅している。2.Bool値に応じてlog出力を制御する
ユーザーはアプリを使って様々な問題に遭遇し、自分やチームの位置付けが悪い場合、ユーザーを肝心な点のロゴを送ることができるのが一番いい分析方法です。しかし、どのようにアプリの実行中のロゴを一部切り取って保存しますか?スイッチのようにロゴの読み書きをコントロールできますか?MQTTLogのソースコードを読むことによって発見されたインスピレーション。
まずNSLogを下マクロに置き換え、プロジェクトの中でSLOGを一括して出力します。
#define SLOG(fmt, ...) if (reportLoggerIsOpen) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__)
はマクロ定義から、レポートロギングIsOpenはログ出力を制御するスイッチであり、リポートロギングIsOpenの定義についてはhファイルでexternからこの変数を宣言してからmファイルで実現することがわかる。hファイル
#import <Foundation/Foundation.h>
extern BOOL reportLoggerIsOpen;
.m
BOOL reportLoggerIsOpen = NO;
+ (void)setLogOpen:(BOOL)open {
reportLoggerIsOpen = open;
}
set LogOpenという方法により、自由自在にコントロールログを書き込むことができます。例えば、登録モジュールのログを取得する必要があります。登録前にtrueに入力してください。登録が完了したら、falseに入力してください。登録モジュールのログだけを残してもいいです。