12

ちょっと面倒です。MPMoviePlayerController を使い始めてから、コンソールは MPAVController からの情報であふれています。例えば:

[MPAVController] Autoplay: _streamLikelyToKeepUp: 1 -> 1
[MPAVController] Autoplay: Disabling autoplay

自分のログ情報を常に検索しなければならないので、これはある種の煩わしさです。特定のオブジェクトまたはフレームワークのログをオフにする方法はありますか?

4

3 に答える 3

10

このようなフィルタリングは、すぐに使用できるとは思いません。stderrただし、 ( で使用される) をパイプにリダイレクトNSLogし、そのパイプからバックグラウンド スレッドで読み取り、フィルターを通過するメッセージをstdout(デバッガーによってもキャプチャされる) に出力することは可能です。このコードは仕事をします:

int main(int argc, char *argv[])
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^(void) {
        size_t const BUFFER_SIZE = 2048;

        // Create a pipe
        int pipe_in_out[2];
        if (pipe(pipe_in_out) == -1)
            return;

        // Connect the 'in' end of the pipe to the stderr
        if (dup2(pipe_in_out[1], STDERR_FILENO) == -1)
            return;

        char *buffer = malloc(BUFFER_SIZE);
        if (buffer == 0)
            return;

        for (;;)
        {
            // Read from the 'out' end of the pipe
            ssize_t bytes_read = read(pipe_in_out[0], buffer, BUFFER_SIZE);
            if (bytes_read <= 0)
                break;

            // Filter and print to stdout
            if (should_show(buffer)) // TODO: Apply filters here
                fwrite(buffer, 1, bytes_read, stdout);
        }

        free(buffer);
        close(pipe_in_out[1]);
    });

    // Rest of main
}

このコードは非常に単純であり、すべてのコーナー ケースを処理するわけではないことに注意してください。まず第一に、 だけでなく、すべてのstderr出力をキャプチャしますNSLog。おそらく、これはコンテンツと照合することで除外される可能性があります。NSLog出力は常に日付と時刻で始まります。

このコードの 2 番目の問題は、パイプから読み取った文字列を分割/結合しようとしないことです。読み取りごとに 1 つあるという保証はありませんNSLog。それらは一緒になっているか、長すぎて分割される可能性があります. これを処理するには、パイプから読み取ったデータの追加処理が必要になります。

とにかく、多くの実用的な目的では、これで十分です。

于 2012-10-15T00:16:21.740 に答える
3

NSLoggerを調べる必要があります。NSLog では実行ごとに表示される内容を選択できませんが、NSLogger では選択できます。NSLogger は、デバイス (またはシミュレーター) からの出力を OS X の独自のウィンドウに表示します。

基本的に施設とレベルの概念を出力に追加します。Unix ウィザードは、この比較で誤りを見つけるかもしれませんが、syslog と非常によく似ていると思います。NSLogger ビューアを使用すると、必要な最小レベルも満たしている 1 つ以上のファシリティ (定義) の出力メッセージを表示できます。

マクロは、出力ウィンドウに表示されるものを定義します。ここに抜粋があります:

#ifdef DEBUG
    #define LOG_GENERAL(level, ...)    LogMessageF(__FILE__,__LINE__,__FUNCTION__,@"general",level,__VA_ARGS__)
#else
    #define LOG_GENERAL(...)    do{}while(0)
#endif

DEBUG がオフの場合、メッセージは表示されません。オンの場合、コードに LOG_GENERAL() ステートメントがあり、ビューアーが機能「一般」を表示するように構成されていて、レベルが表示されるのに十分である場合、メッセージが表示されます。

それは信じられないほど柔軟で、私はそれがとても好きです。プロジェクトに追加するには、約 5 分かかります。詳細とダウンロードについては、上記のリンク先の github ページをご覧ください。

(これは MPAVController がコンソールをメッセージでいっぱいにする問題を解決しませんが、必要なメッセージを新しいウィンドウに表示し、関心のあるものを制御、フィルタリング、および解釈することをはるかに簡単にします。)

于 2012-10-15T00:29:46.793 に答える
0

別のオプションとして、シミュレーターまたは iOS < 6.0 を実行しているデバイスを実行することもできます。

5.0 デバイスまたは 5.1 シミュレータを使用している場合、MPAVController ログ メッセージが表示されません。しかし、それらは 6.0 シミュレーターに確実に表示されます。

もちろん、一般的には現在の OS を使用する必要がありますが、プロジェクトのビデオの多いセクションで作業している場合、その特定の一連のタスクで作業している間に以前のシミュレーターまたはデバイスを実行すると、このロギングの問題を軽減する方法になります。

これにより、ボーナスとして下位互換性テストも提供されます。

于 2012-12-11T17:30:49.650 に答える