Neues OXID-Logging für Info-Einträge nutzen

Hallo in die Runde,

die neuen Logging-Funktionen basierend auf Monolog erlaubt es, prinzipiell Log-Einträge unterschiedlichem Levels abzusetzen (info, notice, warning, error, alert, emergency, critical). Je schwerer der Fehler destso höher das Level. In OXID ist es standardmäßig so konfiguriert, das Log-Einträge erst ab Level “error” in das Log geschrieben werden.

Ich will nun eine “Info” in das Log schreiben (also unterhalb des “error”-Levels):

$oLogger = Registry::getLogger();
$oLogger->info($oEx->getMessage(), array($oEx));

Dieser Log-Eintrag wird nun aufgrund des niedrigen Standard-Log-Levels nicht ins Log geschrieben.

Setze ich in der config.inc.php das logLevel niedriger auf “info” …

$this->sLogLevel = 'info';

… wird mein Log-Eintrag geschrieben. Nun könnte ich das so lassen. Aber damit könnte nun mein Log sich unnötig durch infos und warnings aufblähen. Daher war meine Idee, das ich die Config-Variable “sLogLevel” kurz überschreibe, den info-logger starte und anschließend die Config-Variable wieder auf den Standardwert zurück setze:

$sDefaultLogLevel = $oConfig->getConfigParam('sLogLevel');
$oConfig->setConfigParam('sLogLevel', 'info');
$oLogger = Registry::getLogger();
$oLogger->info($oEx->getMessage(), array($oEx));
$oConfig->setConfigParam('sLogLevel', $sDefaultLogLevel);

Leider reicht das nicht aus, da der Logger bereits schon lange vorher vollständig initialisiert ist und nur noch instanziert wird. Eine Funktion zum nachträglichen ändern des Log-Levels habe ich nicht gefunden.

Ich könnte natürlich einfach meine Info-Log-Message als Error setzen. Dann erscheint sie korrekt im Log, aber dann als Error und nicht als Info.

Habt Ihr eine Idee, wie ich es SAUBER lösen kann?

Hallo Mario :slight_smile:

und wenn eigenen Logger definierst für Deinen Fall?

Paymorrow Modul scheint, dies auch über eigene Logger Klasse zu lösen z.B.

$oLogger = oxRegistry::get( 'OxpsPaymorrowLogger' );

@indianer3c :slight_smile: Das wollte ich ja gerade nicht. Auch das Paypal-Modul hat eine eigene Logger-Klasse. Beide habe ich mir angeschaut. Ich denke ja nur, das sich die OXID-Core-Entwickler bewusst für den neuen Logger Mechanismus entschieden haben, um dort auf Logging-Standards zurück zu greifen. Die wollte ich einfach mit nutzen, statt das Rad neu zu erfinden. Aber irgendwie ist das Logging dann doch zu fest gesurrt. Es gibt offensichtlich zu wenige Config-Setter, die mir eine Manipulation erlauben würden …

@Mario_Lorenz ah verstehe, dann bleibt als Lösung nur Pull-Request übrig :wink:

Ich habe jetzt folgende Lösung gefunden:

Ich instanziere mir einfach einen eigenen Logger auf Basis von Monolog. Dazu habe ich folgende eigene (beispielhafte) Klasse erstellt:

<?php

namespace myVendorABC\Core;

use \OxidEsales\Eshop\Core\Registry;

use \Monolog\Logger;
use \Monolog\Handler\StreamHandler;

class ABCMonologLogger
{
	/**
	* Logger
	* @param obj
	*/
	protected static $_aLogger = array();

	/**
	* get Logger
	*
	* @return Monolog\Logger
	*/
	public static function getLogger(string $sLogger = '', string $sPath = '', string $sLogLevel = '')
	{
		$sLogger = (!empty($sLogger) ? $sLogger : 'OXID Logger');

		if (!array_key_exists($sLogger, self::$_aLogger))
		{
			$sPath = ((!empty($sPath) && is_file($sPath) && is_writable($sPath)) ? $sPath : Registry::getConfig()->getLogsDir() . 'oxideshop.log');

			$sLogLevel = strtoupper($sLogLevel);
			$sLogLevel = ((!empty($sLogLevel) && defined("Logger::$sLogLevel")) ? constant("Logger::$sLogLevel") : Logger::DEBUG);

			self::$_aLogger[$sLogger] = new Logger($sLogger);
			self::$_aLogger[$sLogger]->pushHandler(new StreamHandler(
				$sPath,
				$sLogLevel
			));
		}

		return self::$_aLogger[$sLogger];
	}
}

Aus meinen Modulen heraus, bin ich nun total flexibel:

a) Ich kann jetzt im einfachsten Fall direkt mit in die oxideshop.log als “OXID Logger” schreiben und dabei mit dem niedrigsten LogLevel (debug) arbeiten.

$oLogger = myVendorABC\Core\ABCMonologLogger::getLogger();
$oLogger->info($oEx->getMessage(), array($oEx));

b) oder in die oxideshop.log als “Modul ABC” mit dem niedrigsten LogLevel (debug):

$oLogger = myVendorABC\Core\ABCMonologLogger::getLogger('Modul ABC');
$oLogger->info($oEx->getMessage(), array($oEx));

c) oder in eine eigene Logdatei als “Modul ABC” mit dem niedrigsten LogLevel (debug):

$oLogger = myVendorABC\Core\ABCMonologLogger::getLogger('Modul ABC', 'Pfad zu meiner Logdatei');
$oLogger->info($oEx->getMessage(), array($oEx));
1 Like