2

PyObjC 経由で Cocoa フレームワークをインポートする Django ベースの Web アプリケーションを作成しています。Cocoa フレームワークはあちこちにNSLog()散らばっていて、非デーモン モードで Django サーバーを実行しているときにそれらを見ることができますが、デーモンに移動するとすぐに、この有用なNSLog()出力がすべて失われます。

実際の Python コードによって出力されるログ メッセージとマージできるように、NSLog のものを Pythonloggingモジュールの世界にバブルアップさせる簡単な方法はありますか?

少しグーグルを行ったところ、stderr をリダイレクトし、何らかの方法でそれを Python に吸い戻して、これを実現する必要があるように思われます。

どんな助けでも大歓迎です。

4

1 に答える 1

3

このページによると、NSLogは基本的に次のように機能します

fprintf(stderr, format_string, args ...);

そのため、標準エラー出力をキャプチャ/リダイレクトする必要があります。以前、Python のみのプログラムに役立つかもしれない投稿を書きましたが、Cocoa コードはプロセス レベルのファイル記述子 2 ( stderr) に隠れてアクセスしていると思います。そのため、プロセスをいじる低レベルの作業を行う必要がありますstderr。次に例を示します。

old_stderr = os.dup(sys.stderr.fileno()) # keep a copy
fd = os.open('path/to/mylog', os.O_CREAT | os.O_WRONLY)
os.dup2(fd, sys.stderr.fileno())
# Now, stderr output, including NSLog output, should go to 'path/to/mylog'
...
os.dup2(old_stderr, sys.stderr.fileno())
#stderr restored to its old state

を取得したら、そこからファイルのようなオブジェクトを作成して、たとえば、Python コードと Cocoa コードからの出力をマージする手段として にfd渡すことができます。StreamHandler

于 2010-10-15T23:20:43.300 に答える