ソースのないプリコンパイル済みライブラリを使用していますが、多くのデバッグ ログが出力されています。特定のライブラリだけからの出力を非表示にすることは可能ですか?
1 に答える
いいえNSLog
、そうすべきかどうかを確認せずに、出力を直接標準エラーに書き込みます。関数が呼び出されると、出力が書き込まれます。
ライブラリのデバッグ バージョンを使用している可能性があります。それを作成した人に、ログのないバージョンがあるかどうか、または作成する意思があるかどうかを確認してください。
ログなしでライブラリのバージョンを取得できない場合は、標準エラーを にリダイレクトできます。/dev/null
これNSLog
により、出力がシステムによって破棄されます。これには、低レベルのファイル記述子をいじる必要があり、そのライブラリだけでなく、すべてのログからの出力を破棄することに注意してください。ライブラリ関数を呼び出すときにのみリダイレクトすることで、出力の損失を最小限に抑えることができますが、ライブラリが呼び出す関数またはメソッドのログも無視されます。ログを記録している場合を除いて、常にリダイレクトすることもできます。これは、他のすべてのライブラリのログが破棄されることを意味します。有用なログ (例外メッセージなど) が破棄されないようにする方法がないため、アプリケーションのデバッグ ビルドのリダイレクトはお勧めしません。
ここでは、リダイレクトとリダイレクト解除が機能します (これらは Objective-C メソッドとしても機能することに注意してください)。
int discardLogging() {
static int discardedOutputFD = -1;
if(discardedOutputFD == -1) discardedOutputFD = open("/dev/null", O_WRONLY);
int copy = dup(2); // Duplicate the old file descriptor, so it can be restored
dup2(discardedOutputFD, 2); // Redirect
return copy;
}
void restartLogging(int copy) {
dup2(copy, 2); // Redirect back
close(copy); // Not needed anymore
}
最初の関数は、標準エラーをリダイレクトし/dev/null
て、古いファイル記述子のコピーを返します。2 番目は、それをコピーされた記述子にリダイレクトし、余分なコピーを閉じます。警告: 呼び出されたすべての関数の戻り値は、システム コールにマップされるため、確認する必要があります。