【问题标题】:How can I access CakePHP log files on Heroku?如何访问 Heroku 上的 CakePHP 日志文件?
【发布时间】:2013-05-19 00:27:30
【问题描述】:

我已经为 Heroku 部署了一个 CakePHP 应用程序。 CakePHP 默认将其日志写入 APP_ROOT/app/tmp/logs/error.logAPP_ROOT/app/tmp/logs/debug.log,但由于无法为正在运行的 Heroku web dyno 获取 shell,因此我看不到这些文件的内容。

据我了解,heroku logs 命令返回已转储到STDERRSTDOUT 的所有内容。如果我是对的,有没有办法强制 CakePHP 将其日志发送到 STDOUT

The Heroku PHP Buildpack 将 Apache 和 PHP 日志文件作为后台进程作为 dyno 设置的一部分。见下文。

cat >>boot.sh <<EOF
for var in \`env|cut -f1 -d=\`; do
  echo "PassEnv \$var" >> /app/apache/conf/httpd.conf;
done
touch /app/apache/logs/error_log
touch /app/apache/logs/access_log
tail -F /app/apache/logs/error_log &
tail -F /app/apache/logs/access_log &
export LD_LIBRARY_PATH=/app/php/ext
export PHP_INI_SCAN_DIR=/app/www
echo "Launching apache"
exec /app/apache/bin/httpd -DNO_DETACH
EOF

在该构建包的一个分支中,我在适当的位置添加了自己的行,然后将我的应用配置为使用我的自定义构建包。

touch /app/www/tmp/logs/error.log
tail -F /app/www/app/tmp/logs/error.log &

但这没有用。事实上,撇开 CakePHP 的细节不谈,我在 heroku logs 中也看不到任何 PHP 或 Apache 日志内容。

【问题讨论】:

  • 您可以使用DatabaseLog 登录到数据库,可以是相同的(默认)或其他。优点是它们不会在重新部署时丢失,在适用的情况下在多个应用程序之间共享,并且可以更容易地通过这种方式进行搜索。

标签: php cakephp heroku


【解决方案1】:

我认为以下可能有效。确保您使用的是 CakePHP 2.3.9。

App::uses('ConsoleOutput', 'Console');

CakeLog::config('default', array(
    'engine' => 'ConsoleLog',
    'stream' => new ConsoleOutput('php://stdout')
));

CakeLog::config('stdout', array(
    'engine' => 'ConsoleLog',
    'types' => array('notice', 'info'),
    'stream' => new ConsoleOutput('php://stdout')
));

CakeLog::config('stderr', array(
    'engine' => 'ConsoleLog',
    'types' => array('emergency', 'alert', 'critical', 'error', 'warning', 'debug'),
    'stream' =>  new ConsoleOutput('php://stderr')
));


CakeLog::config('debug', array(
    'engine' => 'ConsoleLog',
    'types' => array('notice', 'info', 'debug'),
    'format' => 'debug %s: %s',
    'stream' => new ConsoleOutput('php://stdout')
));

CakeLog::config('error', array(
    'engine' => 'ConsoleLog',
    'types' => array('warning', 'error', 'critical', 'alert', 'emergency'),
    'format' => 'error %s: %s',
    'stream' =>  new ConsoleOutput('php://stderr')
));

【讨论】:

    【解决方案2】:

    来自 Heroku 文档:https://devcenter.heroku.com/articles/php-logging#cakephp

    在您的应用程序配置中,指示 CakePHP 使用 ConsoleLog 引擎进行记录器设置:

    CakeLog::config('default', array(
        'engine' => 'ConsoleLog',
    ));
    

    然后您可以使用常规的日志记录方法。

    CakeLog::warning("Hello, this is a test message!");
    

    有关更多信息,请参阅 CakePHP 手册的日志部分。

    【讨论】:

      【解决方案3】:

      在最新版本的 CakePHP (>= 3.6.0) 中,config/app.php 文件预先配置为使用环境变量覆盖来覆盖 debugerror 库存日志。这些变量should contain a DSN-style string 定义了您通常放置在config/app.php 文件中的相同属性。

      Settings(或通过heroku cli 工具)下的 Heroku 仪表板中,您可以添加以下 ENV 变量:

      LOG_DEBUG_URL = file:///?className=Cake%5CLog%5CEngine%5CConsoleLog&levels[]=notice&levels[]=info&levels[]=debug
      LOG_ERROR_URL = file:///?className=Cake%5CLog%5CEngine%5CConsoleLog&levels[]=warning&levels[]=error&levels[]=critical&levels[]=alert&levels[]=emergency
      

      以上两行复制了常用的 CakePHP 日志记录,但将所有输出重定向到控制台而不是文件。

      【讨论】:

        猜你喜欢
        • 2012-06-15
        • 2012-09-27
        • 1970-01-01
        • 2013-04-26
        • 2016-05-02
        • 2019-08-31
        • 2016-08-28
        • 1970-01-01
        • 2014-09-08
        相关资源
        最近更新 更多