dockerコンテナで動いているFuelPHPのログをawslogsを使ってCloudWatchに飛ばしたくて、出力先をファイルから標準出力に変更したメモ。
FuelPHPのバージョンは1.7。
デフォルトのログ出力
ログの設定はfuel/app/config/config.php。
log_path
で指定したフォルダ配下に年月日別にフォルダが作成されてログが吐き出される。
logs/2017/05/01/01.phpみたいな形式。
日付フォルダに分けられるの面倒臭い!
ってだけならlog_file
でファイル名を指定すればいいみたいです。
'log_path' => APPPATH.'logs/',
'log_file' => 'app.log',
設定を読んでloggerを設定しているのはfuel/app/core/classes/log.phpのinitialize()。
拡張クラスの作成
initialize()を上書きする為にLogを継承したクラスを作成。
fuel/app/classes配下にlog.phpを配置。
<?php
class Log extends \Fuel\Core\Log
{
public static function initialize()
{
$stream = new \Monolog\Handler\StreamHandler('php://stdout', \Monolog\Logger::DEBUG);
$formatter = new \Monolog\Formatter\LineFormatter("%level_name% - %datetime% --> %message%".PHP_EOL, "Y-m-d H:i:s");
$stream->setFormatter($formatter);
static::$monolog->pushHandler($stream);
}
}
StreamHandlerの指定をphp://stdoutにしました。
作成したクラスをAutoloaderに設定
fuel/app/bootstrap.phpの設定を変更。
Autoloader::add_classes(array(
// Add classes you want to override here
// Example: 'View' => APPPATH.'classes/view.php',
'Log' => APPPATH.'classes/log.php',
));
確認
docker-compose logsで標準出力されているか確認してみる。
➜ docker-compose logs
app_1 | INFO - 2017-06-07 18:22:53 --> Fuel\Core\Request::__construct - Creating a new main Request with URI = "login"
app_1 | INFO - 2017-06-07 18:22:53 --> Fuel\Core\Request::execute - Called
app_1 | INFO - 2017-06-07 18:22:53 --> Fuel\Core\Request::execute - Setting main Request
一応できた。
一般的な方法じゃないかもしれない。
備考
nginxのdocker imageの設定を見て
ログファイルの出力先を/dev/stdoutもしくは、/proc/self/fd/1の
シンボリックリンクにすれば良いかと思って試したけど、
Hander用にファイル読み込むところでPermission denied。