【问题标题】:PM2 doesn't log Python3 print statementsPM2 不记录 Python3 打印语句
【发布时间】:2018-04-19 05:21:03
【问题描述】:

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

pm2 start helloworld.py

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

python3 helloworld.py

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

pm2 logs helloworld

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

【问题讨论】:

    标签: python pm2


    【解决方案1】:

    这个问题是几个月前的问题,所以也许你前一阵子就知道了,但是当我遇到同样的问题时,它是谷歌的热门搜索之一,所以我想我会添加我发现的内容。

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

    【讨论】:

    • 我无法将interpreter_args 用作pm2 命令行选项。所以我制作了一个 bash 脚本,调用 python -u myscript.pypm2 started 那个 bash 脚本。
    • python -u 标志有效!
    【解决方案2】:

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

    【讨论】:

    • 您的示例引用了一个 Node 项目,而问题是关于 Python。
    • @DesignbyAdrian 上面的答案适用于 python 脚本。我会添加更多细节。
    • @DesignbyAdrian 我很欣赏否决票是适当的,因为我没有解决原始发帖人的整个问题。你能考虑取消否决票吗?谢谢
    猜你喜欢
    • 2020-06-03
    • 2013-01-21
    • 2020-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    相关资源
    最近更新 更多