PM2 不记录 Python3 打印语句

PM2 doesn't log Python3 print statements

我在后台使用 PM2 运行 一个 Python 程序

pm2 start helloworld.py

它工作得很好。但是,在 helloworld.py 中,我有几个用作日志的打印语句。例如,当收到网络请求或更新数据库值时。当我 运行 helloworld.py 这样的时候:

python3 helloworld.py

所有这些打印语句都是可见的,我可以调试我的应用程序。但是,当 运行ning

pm2 logs helloworld

none 个打印语句出现。

检查文件夹#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

这个问题是几个月前的问题,所以也许您不久前就想出了这个问题,但它是我遇到同样问题时 google 最热门的问题之一,所以我想我应该补充一下我发现了什么。

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