2012-12-20 3 views
17
// in my PHP code 
$log = new Logger('LaurentCommand'); 
$log->pushHandler(new StreamHandler('./app/logs/LaurentCommand.log')); 
$log->addInfo("Start command",array('username' => 'Joe', 'Age' => '28')); 

Ergebnis in Protokolldatei LaurentCommand.log:Wie wird die letzte Klammer in einer Monolog-Logzeile nicht angezeigt?

[2012.12.20 10.28.11] LaurentCommand.INFO: Startbefehl { "username": "Joe", "Alter": "28"} []

Warum diese Halterung am Ende?

Antwort

42

Das sind die zusätzlichen Daten. Das Standardformat des LineFormatter ist "[%datetime%] %channel%.%level_name%: %message% %context% %extra%\n". Der Benutzername/Alter ist der Kontext, und Extra, das normalerweise leer ist, resultiert in diesem leeren Array [].

Wenn Sie Prozessoren zum Anhängen von Daten zum Protokollieren von Datensätzen verwenden, schreiben sie diese normalerweise in den zusätzlichen Schlüssel, um Konflikte mit Kontextinformationen zu vermeiden. Wenn es wirklich ein Problem für Sie ist, können Sie das Standardformat ändern und %extra% weglassen.

Edit: Ab Monolog 1.11 die LineFormatter hat einen $ ignoreEmptyContextAndExtra Parameter im Konstruktor, dass Sie diese entfernen können, so können Sie verwenden:

// the last "true" here tells it to remove empty []'s 
$formatter = new LineFormatter(null, null, false, true); 
$handler->setFormatter($formatter); 
+5

Seldaek bedeutet '$ log = new Logger ('LaurentCommand'); $ handler = neuer StreamHandler ('./ app/logs/LaurentCommand.log'); $ handler-> setFormatter (neuer LineFormatter ("[% datetime%]% channel%.% Level_name%:% message%% context% \ n")); $ log-> pushHandler ($ handler); $ log-> addInfo ("Startbefehl", Array ('Benutzername' => 'Joe', 'Alter' => '28')); ' – nevvermind

+0

Funktioniert wie ein Zauber. Vielen Dank :) –

4

Ich weiß, dass dies eine alte Frage, aber ich lief hinein und ich möchte meine Lösung teilen.

Die Klammern am Ende der Protokollzeilen sind darauf zurückzuführen, wie Monolog LineFormatter versucht, json_encode() die Daten in %extra%. Die Klammern sind eine JSON-Darstellung eines leeren Arrays.

Um diese Klammern zu deaktivieren, musste ich Monolog\Formatter\LineFormatter mit meiner eigenen Klasse ableiten und seine convertToString($data) Funktion überschreiben, so dass es eine leere Zeichenfolge zurückgibt, wenn keine Daten vorhanden sind. Hier ist meine neue Unterklasse:

namespace My\Fancy\Monolog; 
use Monolog\Formatter\LineFormatter; 

class LineFormatter extends LineFormatter { 

    protected function convertToString($data) 
    { 
     if (null === $data || is_scalar($data)) { 
      return (string) $data; 
     } 

     // BEGIN CUSTOM CODE - This section added to prevent empty 
     // brackets from appearing at the end of log lines: 
     if ((is_array($data) && !$data) 
      || is_object($data) && !get_object_vars($data)) { 
      return ''; 
     } 
     // END CUSTOM CODE 

     $data = $this->normalize($data); 
     if (version_compare(PHP_VERSION, '5.4.0', '>=')) { 
      return $this->toJson($data); 
     } 

     return str_replace('\\/', '/', json_encode($data)); 
    } 
} 

Sie können diese Klasse verwenden, indem Sie eine Instanz davon in Ihre Monolog-Handler-Klasse injizieren, etwa so:

$handler = new Monolog\Handler\StreamHandler('/path/to/my/logfile', 'debug'); 
$handler->setFormatter(new My\Fancy\Monolog\LineFormatter()); 
$monolog->pushHandler($handler); 

Viel Spaß!

4

Alte Frage, aber eine weitere einfache Möglichkeit, werfen:

$slackHandler = new \Monolog\Handler\SlackWebhookHandler(...); 
$slackHandler->getFormatter()->ignoreEmptyContextAndExtra(true); 
Verwandte Themen