簡體   English   中英

如何訪問 Heroku 上的 CakePHP 日志文件?

[英]How can I access CakePHP log files on Heroku?

我已將 CakePHP 應用程序部署到 Heroku。CakePHP 默認將其日志寫入APP_ROOT/app/tmp/logs/error.logAPP_ROOT/app/tmp/logs/debug.log ,但由於無法將 shell 寫入到正在運行的 Heroku web dyno,我看不到這些文件的內容。

據我了解, heroku logs命令返回已轉儲到STDERRSTDOUT的所有內容。 如果我是對的,有沒有辦法強制 CakePHP 將其日志發送到STDOUT

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 日志內容。

我認為以下可能會奏效。 確保您使用的是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')
));

從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手冊的“日志記錄”部分。

在最新版本的CakePHP(> = 3.6.0)中, config/app.php文件已預先配置為使用環境變量覆蓋來進行庫存debugerror日志。 這些變量應該包含一個DSN樣式的字符串,用於定義您通常在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日志庫存,但是將所有輸出重定向到控制台而不是文件。

你可以使用: 'className' => 'Cake\Log\Engine\ConsoleLog'

/**
 * Configures logging options
 */
'Log' => [
    'debug' => [
        'className' => 'Cake\Log\Engine\ConsoleLog',
        'path' => LOGS,
        'file' => 'debug',
        'levels' => ['notice', 'info', 'debug'],
        'url' => env('LOG_DEBUG_URL', null),
    ],
    'error' => [
        'className' => 'Cake\Log\Engine\ConsoleLog',
        'path' => LOGS,
        'file' => 'error',
        'levels' => ['warning', 'error', 'critical', 'alert', 'emergency'],
        'url' => env('LOG_ERROR_URL', null),
    ],
],

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM