iOSにおけるNSLog出力制御タイミングの詳細

2003 ワード


-(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に入力してください。登録モジュールのログだけを残してもいいです。