要望や症状
var/log/prodフォルダ内のログファイルが肥大化し、ディスク容量を圧迫している状況が発生します。
主に影響を受けるファイルは以下の通りです。
- admin.log(管理画面のアクセスログ)
- site.log(サイト全体のログ)
- front.log(フロント画面のログ)
理由や原因
EC-CUBEではSymfonyのMonologを使用してログを記録していますが、デフォルト設定では自動的なログローテーションやファイルサイズ制限が設定されていません。
アプリケーションの動作に伴い、エラーログ、アクセスログ、デバッグ情報などが継続的に蓄積されるため、時間の経過とともにログファイルが肥大化します。
特にプロダクション環境でも詳細なログレベルが設定されている場合、通常のアクセスでもログ出力量が多くなる傾向があります。
解決策
手動でのログ管理
まず安全にログファイルを管理するため、重要なログのバックアップを取得します。
# 重要なログは念のためバックアップ
cp var/log/prod/admin.log var/log/backup/admin_$(date +%Y%m%d).log
cp var/log/prod/site.log var/log/backup/site_$(date +%Y%m%d).log
cp var/log/prod/front.log var/log/backup/front_$(date +%Y%m%d).log
バックアップ取得後、ログファイルを削除または切り詰めます。
# ファイルを空にする(ログローテーション風)
> var/log/prod/admin.log
> var/log/prod/site.log
> var/log/prod/front.log
# または古いファイルを削除
rm var/log/prod/*.log
自動化されたログ管理の実装
継続的な管理のため、crontabを使用して定期的なログ削除を設定できます。
# 毎週日曜日2時に7日以上古いログを削除
0 2 * * 0 find /path/to/eccube/var/log/prod -name "*.log" -mtime +7 -delete
# 月初に前月のログをアーカイブ
0 3 1 * * cd /path/to/eccube && tar -czf var/log/archive/logs_$(date -d "last month" +%Y%m).tar.gz var/log/prod/*.log && > var/log/prod/*.log
ログレベルの調整
ログの出力量を根本的に削減するため、Monologの設定を調整します。app/Customize/Resource/config/monolog.yamlで以下のように設定します。
# app/Customize/Resource/config/monolog.yaml
monolog:
handlers:
main:
type: stream
path: "%kernel.logs_dir%/%kernel.environment%.log"
level: warning # debugからwarningに変更してログ量を削減
channels: ["!event"]
バッチ処理での自動化
Customizeディレクトリにログ管理コマンドを作成することで、より柔軟な管理が可能です。
// app/Customize/Command/LogCleanupCommand.php
<?php
namespace Customize\Command;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Finder\Finder;
class LogCleanupCommand extends Command
{
protected static $defaultName = 'app:log:cleanup';
protected function configure()
{
$this->setDescription('Clean up old log files');
}
protected function execute(InputInterface $input, OutputInterface $output)
{
$logDir = '%kernel.project_dir%/var/log/prod';
$finder = new Finder();
$finder->files()->in($logDir)->name('*.log')->date('< 7 days ago');
foreach ($finder as $file) {
unlink($file->getRealPath());
$output->writeln('Deleted: ' . $file->getFilename());
}
return Command::SUCCESS;
}
}
重要な注意事項
ログ管理を行う際は、以下の点にご注意ください。
- ログ削除前は必ずバックアップを取得してください
- エラー調査中の場合は削除を控えてください
- 本番環境での作業は十分注意して実行してください
- ログローテーション設定変更後は動作確認を行ってください