見出し画像

アプリケーションロガーモジュールの試作で学んだこと #BEAR.Sunday

BEAR.Sunday アドベントカレンダー 2019 の24日目の記事です。

まだ完成はしていないものの、アプリケーションロガーのモジュールを試作をしています。その過程で私が学んだことについて書きたいと思います。Qiita のような技術文書としてではなく、言わば生煮えのブログ形式です。とはいえ、完全につまらないことは書かないつもりです。

ロガーのモジュールを開発することになった理由

実務レベルだと、BEARデフォルトのログとは別に、アプリケーションログを出したいことは多いと思います。

私はメインで担当しているプロジェクトでアプリケーションロガーモジュールを作って便利に使っていました。その後、別のプロジェクトを新たに構築することになった際に、「またあのロガーを、こっちでも使いたいな」と思って、コピペしようと思った時に、「あ、これは、本当は良くないな」と気づくことになりました。プロジェクト間でコピペがしたいと思ったら、それは抽象化(ドメイン分割)の機会と捉えるのが良さそうです(※1)。

(※1)ロバート・C・マーティンの著作「アジャイルソフトウェア開発の奥義」にある「パッケージ設計の原則」を読んでみて下さい、と以前教わったことがありました。パッケージ内部の凝集度に関する3つの原則のうちの最初の原則として、「再利用・リリース等価の原則」(再利用の単位、つまりパッケージは、リリースの単位である)が紹介されています。コードコピペ方式だと、その機能は各プロジェクト毎に別々にリリースタイミングが発生する状態です。うまく再利用できたとは言えません。パッケージにすれば再利用が実現されます。

気づいたこと:依存関係について

パッケージ開発に着手してみるとすぐに、そういった活動による効能に気がつきました。というのは、 AppModule は肥大化する宿命がありいつも気になっていたところだったのですが、パッケージにできている場合に限っては、モジュール間の依存関係は分かりやすくなるのです。下図のように、通常だと「AppModule 無しには何もできない」という全体で1個の大きな団子状態に基本的にはなります。もし、あるモジュールを削除したいとなったら、どこに影響が出るのか慎重に調査する必要があり気を使うことになるでしょう(下図参照)。

画像2

一方、「モジュールがパッケージとして独立している」という状態にできている場合だと、一方向の矢印しかないので、そういった問題は改善されます(下図参照)。

画像2

同様に、composer.json も、(当たり前ですが)パッケージ分割すれば依存関係は明確になります。パッケージを作らないうちは、自分の書いたプロジェクト配下のロガーモジュールがどのコンポーネントに依存していたのか、正確に認識することはできませんでした。

試作物

アプリケーションロガーモジュールに持たせたい機能について考えました。私には、Monolog の諸概念をおさえて Configurable にする口を全部用意するというのは難しいことに思えました。そこで、自分がプロジェクトでたまたま使っている機能に限定して、そのままでまずは下記リポジトリに移しました。それじゃあライブラリとしてはショボイじゃんって感じではありますが、前述のように、依存関係を小さくするプラクティスには意味があると思って。

Fob.MonologLoggerModule

下記のような設定ファイルを設置してアプリケーションでバインド設定を記述すると、

<?php
use Monolog\Logger;

return [
   'fob.app_log' => [
       // BEAR default application context
       'app' => [
           'name' => 'my_project',
           'max_files' => 30,
           'level' => Logger::DEBUG,
           // monolog channel annotation name
           'app_logger' => [
               'suffix_format' => 'Ymd',
               'filename' => 'my_project.log',
           ],
       ],
       'prod' => [
           'level' => Logger::INFO,
       ],
   ]
];


下記のようなログが出せます。

// var/log/app/my_project_20191223.log
2019-12-23 21:15:46 Fob\MonologLoggerDemo [INFO] Fob\MonologLoggerDemo\Resource\Page\Index::onGet(26) Hello, world  []

来年完成させて Qiita の方であらためて紹介できればと思います。

編集後記

今月、記事を2つ書いてみて、こうやってちょっとは勉強をする時間も自分には必要なんだなと感じました。しかし、12月になってからあわてて書き出しているようでは私の場合ダメなのです。来年は・・・11月中に 2 記事くらいは、ストックしておきたい気持ちです。これが鬼が笑うっていうやつでしょうか・・・。良い年末でした。