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

परिणाम:एक मोनोलॉग लॉग लाइन में अंतिम ब्रैकेट दिखाने के लिए कैसे नहीं? लॉग फ़ाइल LaurentCommand.log में

[2012-12-20 10:28:11] LaurentCommand.INFO: प्रारंभ आदेश { "उपयोगकर्ता नाम": "जो", "आयु": "28"} []

अंत में यह ब्रैकेट क्यों?

उत्तर

42

यह अतिरिक्त डेटा है। LineFormatter का डिफ़ॉल्ट प्रारूप "[%datetime%] %channel%.%level_name%: %message% %context% %extra%\n" है। उपयोगकर्ता नाम/आयु संदर्भ है, और अतिरिक्त जो कि इस खाली सरणी [] में आम तौर पर खाली परिणाम है।

यदि आप रिकॉर्ड रिकॉर्ड करने के लिए डेटा संलग्न करने के लिए प्रोसेसर का उपयोग करते हैं तो वे आम तौर पर संदर्भ जानकारी के साथ संघर्ष से बचने के लिए अतिरिक्त कुंजी पर लिखते हैं। यदि यह वास्तव में आपके लिए एक मुद्दा है तो आप डिफ़ॉल्ट प्रारूप बदल सकते हैं और %extra% छोड़ सकते हैं।

संपादित करें: monolog 1.11 के रूप में LineFormatter निर्माता आप इन हटाने देता है कि में एक $ ignoreEmptyContextAndExtra पैरामीटर है, तो आप इस का उपयोग कर सकते हैं:

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

Seldaek '$ लॉग = नए लॉगर ('LaurentCommand') का मतलब है, $ हैंडलर = नया स्ट्रीमहैंडलर ('./ app/logs/LaurentCommand.log'); $ हैंडलर-> सेटफॉर्मेटर (नया लाइनफॉर्मेटर ("[% डेटाटाइम%]% चैनल%।% Level_name%:% message%% संदर्भ% \ n")); $ लॉग-> पुशहैंडलर ($ हैंडलर); $ लॉग-> addInfo ("स्टार्ट कमांड", सरणी ('उपयोगकर्ता नाम' => 'जो', 'आयु' => '28')); ' – nevvermind

+0

एक आकर्षण की तरह काम करता है। धन्यवाद :) –

4

मैं जानता हूँ कि यह एक पुराने सवाल है, लेकिन मैं भाग गया इसमें भी और मैं अपना समाधान साझा करना चाहता हूं।

लॉग लाइनों के अंत में ब्रैकेट्स इस बात के कारण हैं कि कैसे मोनोलॉग LineFormatter में डेटा json_encode() पर प्रयास करता है। ब्रैकेट एक खाली सरणी का JSON प्रतिनिधित्व है।

उन ब्रैकेट को बंद करने के लिए, मैंने अपनी खुद की कक्षा के साथ Monolog\Formatter\LineFormatter उप-वर्ग को समाप्त कर दिया और convertToString($data) फ़ंक्शन को ओवरराइट कर दिया ताकि यदि कोई डेटा मौजूद न हो तो यह खाली स्ट्रिंग लौटाता है। यह मेरा नया उपवर्ग है:

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

आप अपने monolog हैंडलर वर्ग में यह का एक उदाहरण इंजेक्शन लगाने, इसलिए तरह से इस वर्ग का उपयोग कर सकते हैं:

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

का आनंद लें!

4

पुराना सवाल, लेकिन एक और सरल विकल्प बाहर फेंक:

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