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