Tôi biết đây là một câu hỏi cũ, nhưng tôi chạy vào đó và tôi muốn chia sẻ giải pháp của mình.
Dấu ngoặc ở cuối dòng nhật ký là do cách LineFormatter
của Monolog cố gắng để json_encode()
dữ liệu trong %extra%
. Các dấu ngoặc là một biểu diễn JSON của một mảng trống.
Để tắt các dấu ngoặc đó, tôi đã kết thúc phân lớp Monolog\Formatter\LineFormatter
với lớp của riêng mình và ghi đè hàm convertToString($data)
để nó trả về một chuỗi rỗng nếu không có dữ liệu. Dưới đây là lớp con mới của tôi:
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));
}
}
Bạn có thể sử dụng lớp này bằng cách tiêm một thể hiện của nó vào lớp handler Monolog của bạn, như vậy:
$handler = new Monolog\Handler\StreamHandler('/path/to/my/logfile', 'debug');
$handler->setFormatter(new My\Fancy\Monolog\LineFormatter());
$monolog->pushHandler($handler);
Thưởng thức!
Seldaek nghĩa '$ log = Logger mới ('LaurentCommand'); $ handler = new StreamHandler ('./ app/logs/LaurentCommand.log'); $ handler-> setFormatter (new LineFormatter ("[% datetime%]% kênh%.% Level_name%:% message%% context% \ n")); $ log-> pushHandler ($ handler); $ log-> addInfo ("lệnh Bắt đầu", mảng ('tên người dùng' => 'Joe', 'Tuổi' => '28')); ' – nevvermind
Hoạt động như một sự quyến rũ. Cảm ơn :) –