2017/2/1
不具合があったので『Laravel 5.1 でログ出力、それから (ログメールドライバー動作不良対処、クエリ出力の調整)』のほうを見て下さい
Laravel Framework version 5.1.35 (LTS) についての記事です。
muraveです。あんまりにもあんまりな記事(「PHP カンファレンス福岡 2016 で思ったこと」)を上げて反省しましたのでPHPお役立ち記事を書きたいと思います。
CLIコマンドを作ることができるフレームワーク、CakePHPなどもですが、ログ出力時にWebとCLIで実行したユーザーが異なり、権限がらみのエラーが発生したりしがちです。
そもそもログを調べる時、WebとCLIは別ファイルになってた方が良くないです?
ということでログファイルを分ける方法を考えていたのですが、実行ユーザー名でログファイルを作ればいいと気がつきました。まぁ、nginxやapacheユーザーでCLIを扱うと混ざっちゃいますが。
よ~し、おっちゃん、実行ユーザー名からファイル名を決めるインスタンスを作ってloggerを差し替えちゃぞ~
ついでにextraに呼び出し元情報を追加し(参考:「Laravelのログにファイル名やメソッド名を出力する」)、日毎のファイル作成(RotatingFileHandlerベース)にしましょう。
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
$this->app->instance('log', new \Illuminate\Log\Writer(
(new \Monolog\Logger(
$this->app->environment()
))->pushProcessor(
new \Monolog\Processor\IntrospectionProcessor(
\Monolog\Logger::DEBUG,
[
'Monolog\\',
'Illuminate\\',
//他、呼び出し元としてはスキップしたい対象を設定,
]
)
)->pushHandler(
new \Monolog\Handler\RotatingFileHandler(
$this->app->storagePath() . '/logs/' . posix_getpwuid(posix_geteuid())['name'] . '.log',
\Config::get('app.log_max_files', 5)
)
)
)
);
}
// 以下略
bootstrapのapp.php内で設定しようとしたらenv関係でエラーが出たので上記のようにAppServiceProviderのboot()で差し替えていますが、もっと適切な場所があるのでは?というのが気になるところ。
もっとスマートな方法があったら助言いただけるとうれしいなぁ。
2016/07/20 『Laravel 5.1 でログ出力、その後 (出力レベル設定、クエリ出力)』というその後の機能拡張の話を書きました。
タグ: Laravel