gpt4 book ai didi

python - 在 Python 守护进程中维护日志记录和/或 stdout/stderr

转载 作者:太空狗 更新时间:2023-10-29 17:12:04 24 4
gpt4 key购买 nike

我找到的用于在 Python 中创建守护进程的每个方法都涉及两次 fork (对于 Unix),然后关闭所有打开的文件描述符。 (有关示例,请参见 http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/)。

这一切都很简单,但我似乎遇到了一个问题。在我正在设置的生产机器上,我的守护进程正在中止 - 因为所有打开的文件描述符都已关闭,所以静默中止。我目前在调试问题时遇到了困难,想知道捕获和记录这些错误的正确方法是什么。

设置日志记录以使其在守护进程后继续工作的正确方法是什么?我是否在守护进程后第二次调用 logging.basicConfig()?捕获 stdoutstderr 的正确方法是什么?我不清楚为什么所有文件都关闭的细节。理想情况下,我的主要代码可以只调用 daemon_start(pid_file) 并且日志记录将继续工作。

最佳答案

我将 python-daemon 库用于我的守护进程行为。

此处描述的接口(interface):

这里的实现:

它允许指定一个 files_preserve 参数,以指示在守护进程时不应该关闭的任何文件描述符。

如果您需要在守护进程前后通过相同 Handler 实例进行日志记录,您可以:

  1. 首先使用 basicConfigdictConfig 或其他任何设置您的日志处理程序。
  2. 记录内容
  3. 确定您的Handler 所依赖的文件描述符。不幸的是,这取决于 Handler 子类。如果你第一次安装的Handler是一个StreamHandler,它就是logging.root.handlers[0].stream.fileno()的值;如果您的第二个安装的 Handler 是一个 SyslogHandler,您需要 logging.root.handlers[1].socket.fileno() 的值;等等。这很乱 :-(
  4. 通过使用 files_preserve 创建一个 DaemonContext 来守护进程,该文件等于您在第 3 步中确定的文件描述符列表。
  5. 继续记录;你的日志文件不应该在双叉期间关闭。

正如@Exelian 所建议的那样,另一种方法可能是在守护进程之前和之后实际使用不同的 Handler 实例。在守护进程之后,立即销毁现有的处理程序(通过 dellogger.root.handlers 中删除它们?)并创建相同的新处理程序;由于@dave-mankoff 指出的问题,您不能只重新调用 basicConfig

关于python - 在 Python 守护进程中维护日志记录和/或 stdout/stderr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13180720/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com