PM2 不记录 Python3 打印语句

问题描述 投票:0回答:3

我正在使用 PM2 在后台运行 Python 程序,就像这样

pm2 start helloworld.py

而且它工作得很好。但是,在

helloworld.py
中,我有几个充当日志的打印语句。例如,当网络请求传入或数据库值更新时。当我像这样运行
helloworld.py
时:

python3 helloworld.py

所有这些打印语句都是可见的,我可以调试我的应用程序。然而,跑步的时候

pm2 logs helloworld

这些打印语句都没有出现。

python pm2
3个回答
22
投票

这个问题已经有几个月了,所以也许你不久前就发现了这个问题,但当我遇到同样的问题时,它是谷歌的热门搜索之一,所以我想我应该添加我发现的内容。

似乎是 python 如何缓冲 sys.stdout 的问题。在某些平台/实例中,当由 pm2 或 nohup 调用时,sys.stdout 流可能不会被刷新,直到进程退出。将“-u”参数传递给 python 解释器会阻止它缓冲 sys.stdout。在 pm2 的 process.json 中,我添加了 "interpreter_args": "-u" 现在我可以正常获取日志了。


0
投票

对于那些仍然遇到此问题的人:

“python -u .../your_script” 代替 “python .../your_script” 这就是你不希望解释器刷新日志的方式,但对我来说,它仍然只在脚本完成后输出最后 15 行(对于我的服务器来说从来没有)。

事实证明,有一个僵尸守护进程仍在运行,而没有添加“-u”。我进入我的计算机进程并强制退出与 pm2 或守护进程有关的每个进程,当我重新运行我的开发脚本时它解决了问题。

就我而言,僵尸进程是在我们重构并移动文件树之后立即出现的,因此旧的守护进程没有被正确访问和终止。


-1
投票

检查文件夹#HOME/.pm2/logs

参见此处的文件夹结构部分示例:http://pm2.keymetrics.io/docs/usage/quick-start/

还可以考虑使用具有与脚本相关的显式日志文件夹的配置文件。 (请注意,此文件夹必须先存在,pm2 才能使用它。)请参阅 http://pm2.keymetrics.io/docs/usage/application-declaration/

{
"apps": [
    {
        "script": "app/server.js",
        "log_date_format": "YYYY-MM-DD HH:mm Z",
        "error_file": "logs/server.web.error.log",
        "out_file": "logs/server.web.out.log",
    ...

跟踪这些日志文件的好方法是运行 tail

tail -f logs/*.log

更新: 需要明确的是,使用配置文件适用于 python 脚本。只需创建一个 json 配置文件来指定您的脚本以及您希望输出的位置。例如

{
  "apps": [
    {
      "name": "Test Python",
      "script": "test.py",
      "out_file": "test.out.log",
    }
  ]
}

然后运行它 pm2启动test.json 在结果中查找进程 ID。使用此进程 ID 停止进程并查看日志文件的位置。例如。 pm2显示3

© www.soinside.com 2019 - 2024. All rights reserved.