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

quả trong file log LaurentCommand.log:Làm thế nào để không hiển thị khung cuối cùng trong một dòng nhật ký monolog?

[2012/12/20 10:28:11] LaurentCommand.INFO: "Joe", "Tuổi": lệnh { "tên người dùng" bắt đầu: "28"} []

Tại sao khung này ở cuối?

Trả lời

42

Đó là dữ liệu bổ sung. Định dạng mặc định của LineFormatter"[%datetime%] %channel%.%level_name%: %message% %context% %extra%\n". tên người dùng/tuổi là bối cảnh, và thêm rằng thường là kết quả rỗng trong mảng trống này [].

Nếu bạn sử dụng bộ xử lý để đính kèm dữ liệu vào nhật ký, họ thường ghi dữ liệu đó vào khóa bổ sung để tránh xung đột với thông tin ngữ cảnh. Nếu nó thực sự là một vấn đề cho bạn, bạn có thể thay đổi định dạng mặc định và bỏ qua %extra%.

Chỉnh sửa: Tính đến Monolog 1.11 các LineFormatter có một tham số $ ignoreEmptyContextAndExtra trong constructor cho phép bạn loại bỏ những, vì vậy bạn có thể sử dụng này:

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

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

+0

Hoạt động như một sự quyến rũ. Cảm ơn :) –

4

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!

4

Cũ câu hỏi, nhưng ném ra một lựa chọn đơn giản:

$slackHandler = new \Monolog\Handler\SlackWebhookHandler(...); 
$slackHandler->getFormatter()->ignoreEmptyContextAndExtra(true); 
Các vấn đề liên quan