#2264 closed Bug/Fehler (fixed)
Automatisch rotierte Logfiles werden nicht in /admin/logs.php angezeigt
| Reported by: | Owned by: | somebody | |
|---|---|---|---|
| Priority: | normal | Milestone: | modified-shop-2.0.8.0 |
| Component: | Admin | Version: | 2.0.7.2 |
| Keywords: | Cc: | ||
| Blocked By: | Blocking: |
Description
Bei Überschreiten einer Dateigröße von 1 MiB werden Logs im Shop automatisch rotiert. Code in /shoproot/includes/classes/class.logger.php
/**
* threshold default 1MiB
* @var int
*/
private $threshold = 1048576;
/**
* Rotate Logging File
*
* @param string $logfile File name and path of log file.
*/
private function LoggerRotate($logfile)
{
$counter = 0;
foreach (new DirectoryIterator(dirname($logfile)) as $info) {
if ($info->isDot() || !$info->isFile()) {
continue;
}
$fileinfo = pathinfo($info->getFilename());
if ($fileinfo['filename'] == basename($logfile)) {
if ($fileinfo['extension'] > $counter) {
$counter = $fileinfo['extension'];
}
}
}
$counter ++;
// rotate
rename($logfile, $logfile.'.'.$counter);
}
Dadurch wird werden Dateinamen nach folgendem Muster erzeugt:
mod_notice_2022-07-04.log
mod_notice_2022-07-04.log.1
mod_notice_2022-07-04.log.2
Die rotierten Dateien mit Zahlen als Dateiendung (also .log.1, .log.2 etc.) werden im Adminbereich unter "Hilfsprogramme"/"Logfiles" nicht aufgelistet, da hier nur nach Dateien mit den Endungen "log", "log.zip" und "log.gz" gesucht wird. Code in /shoproot/admin/logs.php
$dir = dir(DIR_FS_LOG);
$contents_array = array();
$exts = array("log","log.zip","log.gz");
while ($file = $dir->read()) {
if (!is_dir(DIR_FS_LOG . $file)) {
foreach ($exts as $value) {
if (xtc_CheckExt($file, $value)) {
$contents_array[(date('Y-m-d', filemtime(rtrim($dir->path, '/').'/'.$file)))][] = $file;
}
}
}
}
Auch ein Download der rotierten Dateien wird verhindert, hier werden die letzten drei Zeichen im Dateinamen verglichen. Code in /shoproot/admin/logs.php
switch ($action) {
case 'download':
$extension = substr($_GET['file'], -3);
if ( ($extension == 'zip') || ($extension == '.gz') || ($extension == 'log') ) {
if ($fp = fopen(DIR_FS_LOG . $_GET['file'], 'rb')) {
$buffer = fread($fp, filesize(DIR_FS_LOG . $_GET['file']));
fclose($fp);
header('Content-type: application/x-octet-stream');
header('Content-disposition: attachment; filename=' . $_GET['file']);
echo $buffer;
exit;
}
} else {
$messageStack->add(ERROR_DOWNLOAD_LINK_NOT_ACCEPTABLE, 'error');
}
break;
Lösungsvorschlag:
Beim Rotieren der Logdateien die Nummerierung nicht hinten an den Dateinamen anhängen, sondern vor der Dateiendung. Also zum Beispiel statt mod_notice_2022-07-04.log.1 -> mod_notice_2022-07-04.1.log
Das würde die notwendigen Änderungen auf die Funktion LoggerRotate in class.logger.php beschränken (soweit ich es überblicke).
Attachments (0)
Change History (7)
comment:1 by , 3 years ago
comment:3 by , 3 years ago
noRiddle: Der Vorschlag sieht gut aus, ich sehe auch dass Änderungen an LoggerRotate() deutlich komplexer wären. Danke!
Einzige Anmerkung: Ich würde statt "log\.[0-9]" Wiederholungen der Zahlen einschließen, um auch mehrstellige Zahlen ab 10 aufwärts zu erfassen: "log\.[0-9]*"
comment:5 by , 3 years ago
@Stefan
Jau, aber dann so "log\.[0-9]+", 1 oder mehr mal anstatt 0 oder mehr mal
(Ich liebe Korinthen... :-D)
Gruß,
noRiddle
comment:7 by , 3 years ago
@noRiddle - "+" ist die einzig richtige Lösung, hat nichts mit Korinthen zu tun ;-)

Da die Variable $logfile in der Funktion LoggerRotate() die File-Extension bereits beinhaltet und es somit code-technisch komplexer wird den $counter in den Filename nach deinem Vorschlag zu integrieren, scheint es mir einfacher zu sein die Anpassung in /shoproot/admin/logs.php vorzunehmen.
Wenn man im ersten Code-Teil das Arrays $exts so erweitert
$exts = array("log", "log.zip", "log.gz", "log.[0-9]");hat man bereits erreicht was man möchte.
Korrekter wäre aufgrund der Verwendung der Werte in $exts als Regex in der Funktion xtc_CheckExt() übrigens das:
$exts = array("log","log\.zip","log\.gz", "log\.[0-9]");Ohne das Escapen des . klappt das nur zufällig, weil ja der Punkt ein beliebiges Zeichen repräsentiert.
Dazu noch das Array $exts ganz oben im Code einmalig definieren und im
für die Ermittlung der File-Extension anstatt substr() ebenfalls die Funktion xtc_CheckExt() verwenden. => BINGO
Gruß,
noRiddle