6

OSX 10.8 では、stdout および stderr への出力が Console.app に出力されなくなりました。基本的な print ステートメントを使用してデバッグ情報を出力するコードをサポートする必要があるため、NSLog を使用せずに Console.app で出力を取得したいと考えています (背景情報については、 https: //bitbucket.org/ronaldoussoren/py2app/issue/77 を参照してください)。 )。

NSLog 出力は、「syslog -C」を使用してこれらのログラインを表示できるため、「何とか」ASL (Apple システム ログ) ログに記録されます。そのため、このコードをアプリケーションに追加しようとしました:

aslclient c = asl_open("py2app", "com.apple.console", ASL_OPT_NO_DELAY);
int fd = dup(2);
asl_set_filter(c, ASL_FILTER_MASK_UPTO(ASL_LEVEL_DEBUG));
asl_add_log_file(c, fd);
asl_log(c, NULL, ASL_LEVEL_INFO, "Hello world from py2app launcher");
asl_log_descriptor(c, NULL, ASL_LEVEL_INFO, 1, ASL_LOG_DESCRIPTOR_WRITE);
asl_log_descriptor(c, NULL, ASL_LEVEL_INFO, 2, ASL_LOG_DESCRIPTOR_WRITE);

これは多少機能します: stdout ストリームに行を書き込むと、それらの行は ASL によって変換されます: 出力には通常のログ接頭辞が付けられます:

Nov 20 13:46:14 Gondolin.local py2app[43722] <Info>: Hello world from py2app launcher

ただし、ログファイルは ASL データストアまたは Console.app にはありません。

私が間違っていることを誰かが知っていますか?

4

2 に答える 2

2

次のCコードは、私が望むことをしているようです:

#include <asl.h>
#include <unistd.h>
#include <stdio.h>

static void
setup_logging(void)
{
        aslmsg msg;
        aslclient c = asl_open("py2app", "com.apple.console", 0);

        msg = asl_new(ASL_TYPE_MSG);
        asl_set(msg, ASL_KEY_FACILITY, "com.apple.console");
        asl_set(msg, ASL_KEY_LEVEL, ASL_STRING_NOTICE);
        asl_set(msg, ASL_KEY_READ_UID, "-1");

        int fd = dup(2);
        //asl_set_filter(c, ASL_FILTER_MASK_UPTO(ASL_LEVEL_DEBUG));
        asl_add_log_file(c, fd);
        asl_log(c, NULL, ASL_LEVEL_INFO, "Hello world from py2app launcher");
        asl_log_descriptor(c, msg, ASL_LEVEL_INFO, 1,  ASL_LOG_DESCRIPTOR_WRITE);
        asl_log_descriptor(c, msg, ASL_LEVEL_INFO, 2, ASL_LOG_DESCRIPTOR_WRITE);
}

int main(void)
{
        setup_logging();
        printf("hello world, this is a printf\n");
}

私の最初の試みと比較すると、これには 1 つの変更が含まれています。「aslmsg」引数を使用して、ASL ファシリティ、レベル、および ReadUID を asl_log_descriptor に明示的に設定します。これらの引数がないと、メッセージは Console.app に収まりません。特に、スーパー ユーザー権限がなくてもログ エントリを読み取るには、ReadUID が必要です。

注: 簡単にテストするには、「syslog -C | tail」を使用してコンソール ログを読み取ることができます。ReadUID がないと、「sudo syslog -C」を使用した場合にのみプログラムの出力が表示されました。

于 2013-05-13T17:02:06.427 に答える
1

asl_add_log_file(c, dup(2)) を実行する必要はありません。

また、asl_msg ではなく、asl_log_descriptor への呼び出しでログ レベルを設定することもできます。info レベルのときに syslog にメッセージが表示されなかった理由は、通知を下回るメッセージがデフォルトで除外されるためであることに注意してください (/etc/asl.conf を参照)。

例:

#include <asl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
    asl_log_descriptor(NULL, NULL, ASL_LEVEL_INFO, STDOUT_FILENO, ASL_LOG_DESCRIPTOR_WRITE);
    asl_log_descriptor(NULL, NULL, ASL_LEVEL_NOTICE, STDERR_FILENO, ASL_LOG_DESCRIPTOR_WRITE);
    fprintf(stdout, "This is written to stdout which will be at log level info.");
    fprintf(stderr, "This is written to stderr which will be at log level notice.");
    return 0;
}
于 2014-09-10T06:35:56.153 に答える