使用PyObjC时如何使NSLog使用Python的日志记录模块?

时间:2010-10-11 23:01:00

标签: python django logging pyobjc nslog

我正在编写一个基于Django的webapp,它通过PyObjC导入Cocoa框架。 Cocoa框架有NSLog()遍布它,当我在非守护进程模式下运行Django服务器时我可以看到它们,一旦我转到守护进程,我就会丢失所有这些有用的NSLog()输出。

有没有简单的方法让NSLog的东西冒泡进入Python logging模块的世界,以便它可以与实际Python代码发出的日志消息合并?

做了一点谷歌搜索,似乎你可能不得不重定向stderr并以某种方式将其重新吸回Python以实现这一点,这将是一种无聊......

任何帮助都非常感激。

1 个答案:

答案 0 :(得分:2)

根据this页面,NSLog基本上像

一样工作
fprintf(stderr, format_string, args ...);

因此您需要捕获/重定向标准错误输出。我前段时间写了post这对于仅支持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

一旦你有了fd,就可以创建一个类似文件的对象并将其传递给StreamHandler,例如,作为合并Python代码和Cocoa代码输出的一种方法。