Modify

Opened 3 years ago

Closed 3 years ago

Last modified 3 years ago

#2264 closed Bug/Fehler (fixed)

Automatisch rotierte Logfiles werden nicht in /admin/logs.php angezeigt

Reported by: Stefan May <stefan.may@…> 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 noRiddle, 3 years ago

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

'case: 'download'

für die Ermittlung der File-Extension anstatt substr() ebenfalls die Funktion xtc_CheckExt() verwenden. => BINGO

Gruß,
noRiddle

comment:2 by Gerhard Waldemair, 3 years ago

Resolution: fixed
Status: newclosed

In 14638:

fix #2264 - display rotated log files

comment:3 by Stefan May <stefan.may@…>, 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:4 by Gerhard Waldemair, 3 years ago

In 14640:

revised r14638 (fix #2264 - display rotated log files)

comment:5 by noRiddle, 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:6 by Gerhard Waldemair, 3 years ago

so hat auch mein Commit ausgeschaut ;)

comment:7 by Stefan May <stefan.may@…>, 3 years ago

@noRiddle - "+" ist die einzig richtige Lösung, hat nichts mit Korinthen zu tun ;-)

Modify Ticket

Action
as closed The owner will remain somebody.
The resolution will be deleted. Next status will be 'reopened'.

Add Comment


E-mail address and name can be saved in the Preferences .
 
Note: See TracTickets for help on using tickets.