FuelPHPのログをfluentdの入力に

FuelPHPのログをfluentdに渡したいと考えたのですが、FuelPHPはログを日毎に別ファイルに書き出すので、apacheなどのようにtailではとれません。
最終的にはtailでとれるようになりましたが、そこまでの過程の方が勉強になったのでそれも含めてまとめました。

使用したFuelPHPは 1.7.2 です。

方法1 fuelphp-with-fluentdを使う

最初は、’fuelphp fluentd’で検索して見つかったものです。
fluent-logger-phpfuelphp-with-fluentd を使用します。

いろいろ試す過程で、FuelPHP coreのLogクラスのコードを見るとmonologを使用していることがわかりました。
上記のLogクラスはそれを利用していません。

monologを使っているのであれば…

方法2 MonologFluentHandlerを使う

monologを使用しているのであれば、monologの出力先をfluentdにする方法があるのではないかと思い、’monolog fluentd’で検索してみると見つかりました。
fluent-logger-php  と MonologFluentHandler を使用します。

Usageを参考に、Logクラスを書いて、

app/classes/log.php

<?php
class Log extends \Fuel\Core\Log {
    public static function _init() {
        parent::_init();
        static::$monolog->pushHandler(new \Dakatsuka\MonologFluentHandler\FluentHandler());
    }
}

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' // Logクラスカスタマイズ
));
...

細かいところは調整しなければなりませんが、これで普通にLog::error()などでログ出力すると通常のログファイルに加えFluentHandler経由でfluentdに渡せるはず。簡単にしか試していないのですが、たぶん大丈夫だと思います。

でも、coreのLogクラスを見てみると…

方法3 何も加えなくても設定だけでOK

ここまで調べていた中でcoreのLogクラスのコードで下記の部分を見つけました。

core/classes/log.php

...
            // determine the name and location of the logfile
            $path     = \Config::get('log_path', APPPATH.'logs'.DS);
            $filename = \Config::get('log_file', null);

            if(empty($filename))
            {
                $rootpath = $path.date('Y').DS;
                $filepath = $path.date('Y/m').DS;
                $filename = $filepath.date('d').'.php';
            }
            else
            {
                $rootpath = $path;
                $filepath = $path;
                $filename = $path.$filename;
            }
...

‘log_file’にファイル名を指定しておくと、日毎のファイルではなくそのファイルに出力されるようです。

config.phpには、’log_file’キーはコメントとしても書いていないのですが、試しに書き加えてみると、一ファイルに出力されるようになりました。

config.php

...
    'log_path' => '/var/log/fuelphp/',
    'log_file' => 'fuelphp_log',
...

これだとtailで渡せます。coreのLogクラス内のformatter指定の部分

$formatter = new \Monolog\Formatter\LineFormatter("%level_name% - %datetime% --> %message%".PHP_EOL, "Y-m-d H:i:s");

を参考に、td-agent.confのformatはこんな感じにしました。config_expanderを使っていますが本質的には関係ないです。

/etc/td-agent/td-agent.conf

...
####
## fuelphp
<source>
  type config_expander
  <config>
    type tail
    pos_file /var/log/td-agent/fuelphp_log.pos
    path /var/log/fuelphp/fuelphp_log
    format /^(?<level>[^ ]*) - (?<time>[^ ]* [^ ]*) --> (?<message>.*)$/
    time_format %Y-%m-%d %H:%M:%S
    tag ${hostname}/fuelphp
  </config>
</source>
...

このままだとfuelphpのログファイルが巨大化し続けるので、logrotateを仕掛けておきました。

/etc/logrotate.d/fuelphp

/var/log/fuelphp/*log {
  daily
  rotate 30
  compress
  delaycompress
  notifempty
  create 666 apache apache
}

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA