S3みたいなストレージサーバーっぽいものを自前で用意する⑥【Logging実装】

2022/04/11 2022/05/29 #S3 #ストレージサーバー

S3みたいなストレージサーバーっぽいものを自前で用意する⑥【Logging実装】

こんにちは。のんです。

前回に引き続き自前でストレージサーバーを開発していこうと思います。

今回はロギングの実装について話していきたいと思います。

アプリケーション開発の基本中の基本ですね。

GitHubプロジェクトはこちら

ログにはMonologを採用します

PHPで人気のあるログシステムの一つですね。

とても使いやすく、PSR-3に対応しています。

実装していきます

MonologはPSR-3の LoggerInterface に対応しているので、コンテナに Psr\Log\LoggerInterface として Monolog\Logger を登録しておきます。

$container->add(Psr\Log\LoggerInterface::class, Monolog\Logger::class)
    ->addArgument('storage')
    ->addMethodCall('pushHandler', [
        (new Monolog\Handler\RotatingFileHandler(
            sprintf('%s/../logs/application.log', __DIR__),
            30,
            Nonz250\Storage\App\Foundation\App::environment(Nonz250\Storage\App\Shared\ValueObject\Environment::PRODUCTION)
                ? Monolog\Logger::INFO
                : Monolog\Logger::DEBUG,
        ))->setFormatter(new Monolog\Formatter\JsonFormatter()),
    ]);

コンテナに登録するときに addMethodCallpushHandler メソッドを呼ぶようにしておきます。 pushHandler メソッドはMonologの関数です。

この関数に、 RotatingFileHandler クラスを渡すようにしておくとログをローテーションしてくれます。

(new Monolog\Handler\RotatingFileHandler(
    sprintf('%s/../logs/application.log', __DIR__),
    30,
    Nonz250\Storage\App\Foundation\App::environment(Nonz250\Storage\App\Shared\ValueObject\Environment::PRODUCTION)
        ? Monolog\Logger::INFO
        : Monolog\Logger::DEBUG,

名前は application.log です。ローテーションの間隔は30日間ですね。本番環境ではinfoレベルまで、それ以外ではdebugレベルまでログに残すような仕組みになっています。

また、ログの内容はjson方式で登録できるようにしておきます。

後々、分解したり解析したりしやすくなるでしょう。

->setFormatter(new Monolog\Formatter\JsonFormatter()),

JsonFormatter はMonologに標準で実装されていますね。フィールドなどをカスタマイズしたい場合は継承したりして自作しましょう。

Monologをコンテナに登録できたので、実際のコードを見てみる

実際にログに残しているところはこちら。

ファイルアップロードする処理の中でファイルのサイズをデバッグログとして記録します。

public function uploadOriginImage(File $file): string
{
    $uploadStorageDirectory = getcwd() . self::UPLOAD_ORIGIN_DIRECTORY;
    $this->createDir($uploadStorageDirectory);

    $originFilePath = $uploadStorageDirectory . DIRECTORY_SEPARATOR . $file->uniqueFileNameWithOriginExtension();
    $byte = file_put_contents($originFilePath, (string)$file->fileString());
    if ($byte === false) {
        throw new UploadFileException('Failed to upload file.');
    }

    $this->logger->debug(sprintf('%s is %s bytes.', $file->fileNameWithOriginExtension(), $byte));

    return $originFilePath;
}

この関数はアップロードされたファイルの原寸大のファイルをそのまま保存します。
この時にどれくらいのイメージサイズなのかをログに残すのですが、

$this->logger->debug(sprintf('%s is %s bytes.', $file->fileNameWithOriginExtension(), $byte));

で記録しています。

その結果がこちら

{"message":"hoge.jpeg is 4006827 bytes.","context":{},"level":100,"level_name":"DEBUG","channel":"storage","datetime":"2022-04-23T06:37:25.545894+09:00","extra":{}}

ログなので余計な改行なく記録されています。

これをフォーマッターに通すと、

{
    "message": "hoge.jpeg is 4006827 bytes.",
    "context": {},
    "level": 100,
    "level_name": "DEBUG",
    "channel": "storage",
    "datetime": "2022-04-23T06:37:25.545894+09:00",
    "extra": {}
}

という感じになります。

最後に

これで、本番運用中の調査も楽ちんになりました。

とは言っても自分で使うサービスなので、ログを確認することはほとんど無いかも知れません。

ログがあると開発中も色々便利なので入れた。という感じですかね。

次回は実際のファイルアップロードについて触れて最終回となるかも知れません。

今回は短かったですが次回は長くなりそう。長くなりすぎる場合は何個かに切り取りましょうかね。

また記事にします。

そのときはよしなに。

.

のん

名刺 : About me.

YouTube : のんラボ

Twitter : @nonz250

Github : nonz250

Qiita : @nonz250

My Qiita posts My Qiita contributions My Qiita followers

主にPHPを使用し、サーバーサイドを担当。最近はフロントにも興味津々。

なにかを作ったりいじったりするのが好きで、個人開発なども行っている。

趣味はバイクアイコン画像は大抵愛車の「Z250」である。友達にアイコン描いてもらえて嬉しい。

PHP / Laravel / CakePHP2 / CakePHP3 / Vue / Nuxt / C# / etc...

Tags

#のんラボ #Laravel #Vue #個人開発 #ブログ #プログラミング #javascript #Html5 #WEBサービス #Twitter #今年の抱負メーカー #勉強方法 #PWA #モバイルアプリ #Android #ツーリング #バイクに乗るエンジニア #Z250 #秋吉台 #能登半島 #バイク #冒険 #東尋坊 #Squid #リバースプロキシ #hosts #axios #cropper #AdSense #Bootstrap #MySQL #高速化 #トドTask #Telescope #デバッグ #composer #テスト #セキュリティ #POSレジ #スマレジ #本部機能 #バリデーション #入力チェック #Mac #Chrome #テスト駆動開発 #開発手法 #UI #デザイン #WEBサイト #機能美 #PHP #Laravel 6 #コメント #バージョンアップ #vue-cli #localhost #BIツール #売上分析 #TANAX #MFK250 #ツアーシェルケース2 #RESTful #API #REST API #実務的 #PHP Tech Tutor #Smaregi Tech Talk #勉強会 # ブログ #CakePHP3 #CSRF #VSCode #開発環境 #CakePHP3.0 #さくらのレンタルサーバー #モジュールモード #シェル #メール #Gmail #relay #OGP #エラーページ #抱負 #家庭教師 #ドメイン駆動設計 #DDD #読書会 #那智の滝 #伊勢志摩 #伊勢志摩スカイライン #フロント #三方五湖 #レインボーライン #ボーイスカウト・ルール #プログラマが知るべき97のこと #リファクタリング #ユビキタス言語 #車輪の再発明 #マイクロサービス #デプロイ #QA #laravel-mix #Tips #storybook #@storybook/addon-actions #昇降デスク #コードレス #書斎 #オフィス #リモートワーク #働き方 #エラーハンドリング #スマレジ4 #pixel 5 #レビュー #スマレコ #TDD #RSS #404 #高山ダム #ラーツー #React #Nuxt #node_modules #エラー #インポート #設定方法 #環境構築 #Docker #フォレストパーク神野山 #学生向け #PR #採用 #Node.js #npm #しまなみ海道 #youtube #CSS #IE #SLA #Rust #千里浜なぎさドライブウェイ #千里浜 #インサイドセールス #曽爾高原 #無線LAN #ポートフォリオ #バルカンS #納車 #Next.js #チームビルディング #リーダー #悩み #Github Actions #Marp #ネタ #サーバー移行 #S3 #ストレージサーバー #RFC 7807 #Digest #認証 #Xdebug #CLI #西日本 #例外