CakePHP4にcomposerでlog4phpを導入する
ログですが、CakePHP4にはCake\Log\Logというクラスがありログ関連の機能はあって公式ドキュメントにも使い方とか載ってます。ですがCakePHP2のときからlog4phpを使っていたのでCakePHP4アプリでも導入しようか迷ってたのですが、CakePHP4の標準の方に比べるとlog4phpの方が例外のスタックトレース出力が楽そうだったので、やっぱりlog4phpを導入することにしました。
CakePHP4標準の方でも例外のスタックトレースを例外オブジェクトから文字列出力して文字列としてログに出力すれば問題ないんですけど、log4phpだとログメソッドに例外オブジェクト渡すので好きにしてっていう感じでよかったのもあります。あとlog4phpだと開発環境と本番環境をxmlの設定ファイルを差し替えるだけでよかったり、エラーログはメールで送ってもらったりも実績があったりで、やっぱり慣れてるので。
composerで追加して設定する
実際やってみるとすぐ導入できたのですが、まずCakePHP4の環境を作ってからlog4phpを追加します。
composer create-project --prefer-dist cakephp/app:"4.*" test-app
cd test-app
composer require "apache/log4php"log4phpはバージョンを付与するとエラーになったのでバージョンは付けずに入れました。次にlog4phpの設定XMLファイルを準備します。今回はテストなのでログファイルに出力するだけの簡単なファイルとしました。
<?xml version="1.0" encoding="UTF-8"?>
<configuration xmlns="http://logging.apache.org/log4php/">
<appender name="output_file" class="LoggerAppenderDailyFile">
<layout class="LoggerLayoutPattern">
<param name="ConversionPattern" value="%d[%-5p]%l - %m%n%newline%throwable" />
</layout>
<param name="file" value="logs/app.%s.log" />
<param name="append" value="true" />
</appender>
<root>
<level value="all" />
<appender_ref ref="output_file" />
</root>
</configuration>次に共通処理からxmlを読み込みます。
// 末尾
\Logger::configure(ROOT . DS . 'config' . DS . 'log4php.xml');Controllerからログ出力してみる
設定が終わったのでControllerからログを出力してみます。
<?php
namespace App\Controller;
class TestController extends AppController
{
public function index()
{
$logger = \Logger::getLogger($this::class);
$logger->info('情報です。');
$logger->error('エラーです。');
$logger->error('例外を入れた場合です。', new \RuntimeException('外', 0, new \RuntimeException('内')));
return $this->render();
}
}<?php /* 空 */ ?>動作確認してみる
ではサーバーを起動して表示してみます。
bin/cake server
まぁ何も表示はされないですが、正常に動作したようです。ではログファイルを見てみます。
2023-12-14T09:41:44+00:00[INFO ]App\Controller\TestController.index(***\test-app\src\Controller\TestController.php:9) - 情報です。
2023-12-14T09:41:44+00:00[ERROR]App\Controller\TestController.index(***\test-app\src\Controller\TestController.php:10) - エラーです。
2023-12-14T09:41:44+00:00[ERROR]App\Controller\TestController.index(***\test-app\src\Controller\TestController.php:11) - 例外を入れた場合です。
RuntimeException: 内 in ***\test-app\src\Controller\TestController.php:11
Stack trace:
#0 ***\test-app\vendor\cakephp\cakephp\src\Controller\Controller.php(560): App\Controller\TestController->index()
#1 ***\test-app\vendor\cakephp\cakephp\src\Controller\ControllerFactory.php(140): Cake\Controller\Controller->invokeAction(Object(Closure), Array)
#2 ***\test-app\vendor\cakephp\cakephp\src\Controller\ControllerFactory.php(115): Cake\Controller\ControllerFactory->handle(Object(Cake\Http\ServerRequest))
#3 ***\test-app\vendor\cakephp\cakephp\src\Http\BaseApplication.php(325): Cake\Controller\ControllerFactory->invoke(Object(App\Controller\TestController))
#4 ***\test-app\vendor\cakephp\cakephp\src\Http\Runner.php(86): Cake\Http\BaseApplication->handle(Object(Cake\Http\ServerRequest))
#5 ***\test-app\vendor\cakephp\cakephp\src\Http\Middleware\CsrfProtectionMiddleware.php(176): Cake\Http\Runner->handle(Object(Cake\Http\ServerRequest))
#6 ***\test-app\vendor\cakephp\cakephp\src\Http\Runner.php(82): Cake\Http\Middleware\CsrfProtectionMiddleware->process(Object(Cake\Http\ServerRequest), Object(Cake\Http\Runner))
#7 ***\test-app\vendor\cakephp\cakephp\src\Http\Middleware\BodyParserMiddleware.php(157): Cake\Http\Runner->handle(Object(Cake\Http\ServerRequest))
#8 ***\test-app\vendor\cakephp\cakephp\src\Http\Runner.php(82): Cake\Http\Middleware\BodyParserMiddleware->process(Object(Cake\Http\ServerRequest), Object(Cake\Http\Runner))
#9 ***\test-app\vendor\cakephp\cakephp\src\Routing\Middleware\RoutingMiddleware.php(189): Cake\Http\Runner->handle(Object(Cake\Http\ServerRequest))
#10 ***\test-app\vendor\cakephp\cakephp\src\Http\Runner.php(82): Cake\Routing\Middleware\RoutingMiddleware->process(Object(Cake\Http\ServerRequest), Object(Cake\Http\Runner))
#11 ***\test-app\vendor\cakephp\cakephp\src\Routing\Middleware\AssetMiddleware.php(68): Cake\Http\Runner->handle(Object(Cake\Http\ServerRequest))
#12 ***\test-app\vendor\cakephp\cakephp\src\Http\Runner.php(82): Cake\Routing\Middleware\AssetMiddleware->process(Object(Cake\Http\ServerRequest), Object(Cake\Http\Runner))
#13 ***\test-app\vendor\cakephp\cakephp\src\Error\Middleware\ErrorHandlerMiddleware.php(149): Cake\Http\Runner->handle(Object(Cake\Http\ServerRequest))
#14 ***\test-app\vendor\cakephp\cakephp\src\Http\Runner.php(82): Cake\Error\Middleware\ErrorHandlerMiddleware->process(Object(Cake\Http\ServerRequest), Object(Cake\Http\Runner))
#15 ***\test-app\vendor\cakephp\debug_kit\src\Middleware\DebugKitMiddleware.php(60): Cake\Http\Runner->handle(Object(Cake\Http\ServerRequest))
#16 ***\test-app\vendor\cakephp\cakephp\src\Http\Runner.php(82): DebugKit\Middleware\DebugKitMiddleware->process(Object(Cake\Http\ServerRequest), Object(Cake\Http\Runner))
#17 ***\test-app\vendor\cakephp\cakephp\src\Http\Runner.php(67): Cake\Http\Runner->handle(Object(Cake\Http\ServerRequest))
#18 ***\test-app\vendor\cakephp\cakephp\src\Http\Server.php(99): Cake\Http\Runner->run(Object(Cake\Http\MiddlewareQueue), Object(Cake\Http\ServerRequest), Object(App\Application))
#19 ***\test-app\webroot\index.php(40): Cake\Http\Server->run()
#20 {main}
Next RuntimeException: 外 in ***\test-app\src\Controller\TestController.php:11
Stack trace:
#0 ***\test-app\vendor\cakephp\cakephp\src\Controller\Controller.php(560): App\Controller\TestController->index()
#1 ***\test-app\vendor\cakephp\cakephp\src\Controller\ControllerFactory.php(140): Cake\Controller\Controller->invokeAction(Object(Closure), Array)
#2 ***\test-app\vendor\cakephp\cakephp\src\Controller\ControllerFactory.php(115): Cake\Controller\ControllerFactory->handle(Object(Cake\Http\ServerRequest))
#3 ***\test-app\vendor\cakephp\cakephp\src\Http\BaseApplication.php(325): Cake\Controller\ControllerFactory->invoke(Object(App\Controller\TestController))
#4 ***\test-app\vendor\cakephp\cakephp\src\Http\Runner.php(86): Cake\Http\BaseApplication->handle(Object(Cake\Http\ServerRequest))
#5 ***\test-app\vendor\cakephp\cakephp\src\Http\Middleware\CsrfProtectionMiddleware.php(176): Cake\Http\Runner->handle(Object(Cake\Http\ServerRequest))
#6 ***\test-app\vendor\cakephp\cakephp\src\Http\Runner.php(82): Cake\Http\Middleware\CsrfProtectionMiddleware->process(Object(Cake\Http\ServerRequest), Object(Cake\Http\Runner))
#7 ***\test-app\vendor\cakephp\cakephp\src\Http\Middleware\BodyParserMiddleware.php(157): Cake\Http\Runner->handle(Object(Cake\Http\ServerRequest))
#8 ***\test-app\vendor\cakephp\cakephp\src\Http\Runner.php(82): Cake\Http\Middleware\BodyParserMiddleware->process(Object(Cake\Http\ServerRequest), Object(Cake\Http\Runner))
#9 ***\test-app\vendor\cakephp\cakephp\src\Routing\Middleware\RoutingMiddleware.php(189): Cake\Http\Runner->handle(Object(Cake\Http\ServerRequest))
#10 ***\test-app\vendor\cakephp\cakephp\src\Http\Runner.php(82): Cake\Routing\Middleware\RoutingMiddleware->process(Object(Cake\Http\ServerRequest), Object(Cake\Http\Runner))
#11 ***\test-app\vendor\cakephp\cakephp\src\Routing\Middleware\AssetMiddleware.php(68): Cake\Http\Runner->handle(Object(Cake\Http\ServerRequest))
#12 ***\test-app\vendor\cakephp\cakephp\src\Http\Runner.php(82): Cake\Routing\Middleware\AssetMiddleware->process(Object(Cake\Http\ServerRequest), Object(Cake\Http\Runner))
#13 ***\test-app\vendor\cakephp\cakephp\src\Error\Middleware\ErrorHandlerMiddleware.php(149): Cake\Http\Runner->handle(Object(Cake\Http\ServerRequest))
#14 ***\test-app\vendor\cakephp\cakephp\src\Http\Runner.php(82): Cake\Error\Middleware\ErrorHandlerMiddleware->process(Object(Cake\Http\ServerRequest), Object(Cake\Http\Runner))
#15 ***\test-app\vendor\cakephp\debug_kit\src\Middleware\DebugKitMiddleware.php(60): Cake\Http\Runner->handle(Object(Cake\Http\ServerRequest))
#16 ***\test-app\vendor\cakephp\cakephp\src\Http\Runner.php(82): DebugKit\Middleware\DebugKitMiddleware->process(Object(Cake\Http\ServerRequest), Object(Cake\Http\Runner))
#17 ***\test-app\vendor\cakephp\cakephp\src\Http\Runner.php(67): Cake\Http\Runner->handle(Object(Cake\Http\ServerRequest))
#18 ***\test-app\vendor\cakephp\cakephp\src\Http\Server.php(99): Cake\Http\Runner->run(Object(Cake\Http\MiddlewareQueue), Object(Cake\Http\ServerRequest), Object(App\Application))
#19 ***\test-app\webroot\index.php(40): Cake\Http\Server->run()
#20 {main}まとめ
log4phpでログ出力できました。例外のスタックトレースも出力されているのでエラー時の解析に使えそうです。
