我正在编写一个基于Django的webapp,它通过PyObjC导入Cocoa框架。 Cocoa框架有NSLog()
遍布它,当我在非守护进程模式下运行Django服务器时我可以看到它们,一旦我转到守护进程,我就会丢失所有这些有用的NSLog()
输出。
有没有简单的方法让NSLog的东西冒泡进入Python logging
模块的世界,以便它可以与实际Python代码发出的日志消息合并?
做了一点谷歌搜索,似乎你可能不得不重定向stderr并以某种方式将其重新吸回Python以实现这一点,这将是一种无聊......
任何帮助都非常感激。
答案 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代码输出的一种方法。