﻿id	summary	reporter	owner	description	type	status	priority	milestone	component	version	resolution	keywords	cc	blockedby	blocking
2264	Automatisch rotierte Logfiles werden nicht in /admin/logs.php angezeigt	Stefan May <stefan.may@…>	somebody	"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).

"	Bug/Fehler	closed	normal	modified-shop-2.0.8.0	Admin	2.0.7.2	fixed				
