49 lines
1.4 KiB
PHP
49 lines
1.4 KiB
PHP
|
|
<?php
|
|||
|
|
|
|||
|
|
declare(strict_types=1);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Logrotation für storage/logs/*.log — NUR CLI, per Cron 1×/Woche.
|
|||
|
|
*
|
|||
|
|
* Wird eine Datei größer als das Limit, wandert sie nach <name>.log.1 (eine
|
|||
|
|
* vorhandene .1 wird ersetzt) und das aktive Log startet leer. Damit bleiben
|
|||
|
|
* höchstens zwei Generationen pro Log liegen — genug zum Nachsehen, ohne dass
|
|||
|
|
* spam.log oder php-errors.log auf dem Shared Hosting unbegrenzt wachsen.
|
|||
|
|
*
|
|||
|
|
* Aufruf: php bin/log-rotate.php [--max-mb=2]
|
|||
|
|
*/
|
|||
|
|
if (PHP_SAPI !== 'cli') {
|
|||
|
|
exit(1);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
require dirname(__DIR__) . '/app/bootstrap.php';
|
|||
|
|
|
|||
|
|
$maxMb = 2.0;
|
|||
|
|
foreach ($argv as $arg) {
|
|||
|
|
if (preg_match('/^--max-mb=([0-9.]+)$/', $arg, $m) === 1) {
|
|||
|
|
$maxMb = (float) $m[1];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
$limit = (int) ($maxMb * 1024 * 1024);
|
|||
|
|
|
|||
|
|
$rotated = 0;
|
|||
|
|
foreach (glob(STORAGE_PATH . '/logs/*.log') ?: [] as $log) {
|
|||
|
|
$size = (int) @filesize($log);
|
|||
|
|
if ($size <= $limit) {
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
if (!@rename($log, $log . '.1')) {
|
|||
|
|
fwrite(STDERR, 'Rotation fehlgeschlagen: ' . basename($log) . "\n");
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
// Neue, leere Datei mit denselben Rechten anlegen, damit PHP/Cron weiterschreiben können.
|
|||
|
|
@touch($log);
|
|||
|
|
@chmod($log, 0664);
|
|||
|
|
echo 'rotiert: ' . basename($log) . ' (' . round($size / 1048576, 1) . " MB)\n";
|
|||
|
|
$rotated++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
echo $rotated === 0
|
|||
|
|
? "Nichts zu rotieren (alle Logs unter {$maxMb} MB).\n"
|
|||
|
|
: "{$rotated} Log(s) rotiert.\n";
|