やりたいこと
結論からいうと、Laravelのstorage/logsディレクトリ配下の**logファイルをzip形式に圧縮するよ**って話です。業務で関わっているサービスでstorage/logsディレクトリ以下をS3に保存する処理があるのですが、如何せんlogファイルのサイズが大きくS3のボリュームがすぐにいっぱいになってしまいます。
そこで、s3に保存するファイルをzip形式に圧縮しようとなり、その時に実装を備忘録として残します。
*今回、あくまでzipファイルを作成するまでの処理で、s3に保存する処理は省略しています。
zipファイル作成にはZipArchiveを使えば楽
かつてはchumper/zipperをcomposerでインストールすれば簡単にzipファイルを作成できたらしいのですが、どうやらLaravel6.0以降ではchumper/zipperが使用できなくっていました。ですので、Laravel6.0以降ではZipArchiveを使いましょう!
以下のように書きました。
(開発の終わりでリファクタリングする予定ですが、取り急ぎのコードだということを御了承ください)
// 任意のファイル名を決める
$logPath = storage_path('zip/log' . '.zip');
// zipArchive発動
$zip = new ZipArchive();
$zip->open($logPath, ZipArchive::CREATE);
for($i = 1 ; $i <=3 ; $i++) {
// storage/logsディレクトリ以下のファイルを追加
$zip->addFile('storage/logs/data/data-'. $i . '.log');
$zip->addFile('storage/logs/debug/debug-'. $i . '.log');
$zip->addFile('storage/logs/error/error-'. $i . '.log');
}
$zip->close()
これでstorage/logsディレクトリ以下にzipディレクトリが作成されて、logsファイルが圧縮された形で保管されているはずです。
追加で
例えば、3日前のlogだけを取得したい場合などはCarbonで指定してあげればいいですね。 僕は実務で以下のように書きました。$subDay = Carbon::now()->subDay(3)->toDateString();
for($i = $subDay ; $i <=$subDay ; $i++) {
// storage/logsディレクトリ以下のファイルを追加
$zip->addFile('storage/logs/data/data-'. $i . '.log');
$zip->addFile('storage/logs/debug/debug-'. $i . '.log');
$zip->addFile('storage/logs/error/error-'. $i . '.log');
}
簡単ですが、以上になります。