2012-12-20 11 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')); 

Wynik w pliku dziennika LaurentCommand.log:Jak nie wyświetlać ostatniego nawiasu w linii logu monologu?

[20.12.2012 10:28:11] LaurentCommand.INFO: "Joe", "wiek": polecenie { "nazwa użytkownika" start: "28"} []

Dlaczego ten wspornik na końcu?

Odpowiedz

42

To dodatkowe dane. Domyślny format LineFormatter to "[%datetime%] %channel%.%level_name%: %message% %context% %extra%\n". nazwa użytkownika/wiek jest kontekstem, a dodatkowe, zazwyczaj puste wyniki w tej pustej tablicy [].

Jeśli używasz procesorów do dołączania danych do rekordów dziennika, zazwyczaj zapisują go w dodatkowym kluczu, aby uniknąć konfliktów z informacjami kontekstowymi. Jeśli to naprawdę problem, możesz zmienić domyślny format i pominąć %extra%.

Edit: Od Monolog 1.11 LineFormatter ma parametr $ ignoreEmptyContextAndExtra w konstruktorze, który pozwala usunąć te, więc można to wykorzystać:

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

Seldaek oznacza '$ log = new Logger ('LaurentCommand'); $ handler = new StreamHandler ('./ app/logs/LaurentCommand.log'); $ handler-> setFormatter (nowa LineFormatter ("[% datetime%]% channel%.% Level_name%:% message%% context% \ n")); $ log-> pushHandler ($ handler); $ log-> addInfo ("Polecenie startowe", tablica ("nazwa użytkownika" => 'Joe', 'Wiek' => '28')); ' – nevvermind

+0

Działa jak urok. Dzięki :) –

4

wiem, jest to stara sprawa, ale wpadłem w to również i chcę podzielić się moim rozwiązaniem.

Nawiasy na końcu wierszy dziennika wynikają z tego, jak Monolog LineFormatter próbuje uzyskać dane w %extra%. Nawiasy są reprezentacją JSON pustej tablicy.

Aby wyłączyć te nawiasy, skończyło się na konieczności podklasy Monolog\Formatter\LineFormatter z własnej klasy i zastąpienie jej convertToString($data) funkcji, dlatego zwraca pusty ciąg jeśli nie ma obecnych danych. Oto moja nowa podklasa:

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)); 
    } 
} 

Można użyć tej klasy wstrzykując wystąpienie go do monolog klasy procedury obsługi, jak w przykładzie:

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

Enjoy!

4

Stare pytanie, ale wyrzucając kolejną prostą opcję:

$slackHandler = new \Monolog\Handler\SlackWebhookHandler(...); 
$slackHandler->getFormatter()->ignoreEmptyContextAndExtra(true); 
Powiązane problemy