- vừa được xem lúc

[Symfony 4] Ẩn một số log không cần thiết với custom handler

0 0 10

Người đăng: Phan Ngoc

Theo Viblo Asia

Bối cảnh

Symfony phát sinh khá nhiều log như, như process init, begin transaction, ini, . Hầu như những log này cung cấp thông tin ít quan trọng, nhưng lại gây nhiễu hệ thống log và đặc biệt là tốn tiền khách hàng (khi dùng các dịch vụ cloud như AWS Cloudwatch log để lưu trữ và filter log). Sau đây là các cách để ẩn bớt đi nhé

Giải phát

Dùng log level setting

Trong file monolog.yml, set biến log level tới 1 cấp đó mà bạn cảm thấy cần thiết, phục vụ tốt thông tin cho việc debug và các task điều tra

 cloudWatch: type: service action_level: "%env(LOG_LEVEL)%" id: cloudwatch_handler channels: ["!event", "!doctrine", "!php"]

Các cấp độ setting log level các bạn có thể tham khảo

DEBUG: Detailed debug information.
INFO: Interesting events or information.
NOTICE: Normal but significant events.
WARNING: Exceptional occurrences that are not errors.
ERROR: Runtime errors that do not require immediate action.
CRITICAL: Critical conditions.
ALERT: Action must be taken immediately.
EMERGENCY: System is unusable.

Dùng custom handler (xịn hơn)

Vì các log dư này đa phần là log debug và log info, nó cũng cùng cấp độ với các log mình hay add vào để điều tra, nên rất khó dùng cách trên, vậy nên dùng 1 handle đứng đầu để lọc bớt các message chỉ định cụ thể là giải pháp mình thấy khá ổn

  • Tạo 1 custom handle đừng đầu chuỗi log.
handlers: main: type: service id: monolog.custom_handler.service level: debug handler: cloudWatch
  • Trong service.yml thêm define class.
 monolog.custom_handler.service: class: Customize\Log\CustomHandler
  • Trong folder Customize/Log thêm class:
<?php namespace Customize\Log; use Monolog\Handler\AbstractHandler; class CustomHandler extends AbstractHandler
{ public function handle(array $record) { // Check if handling level was reached if ($record['level'] < $this->level) return false; $listMessageRemoved = [ 'INIT', 'PROCESS START', 'PROCESS END', 'User was reloaded', 'Checking support on guard authenticator', 'Guard authenticator does not support the request', 'Checking for guard authentication credentials', 'Read existing security token from the session', 'Stored the security token in the session', 'Matched route', 'LOGIC START', 'LOGIC END', 'Begin Transaction', 'Commit executed', 'fallback to PC layout', ]; foreach ($listMessageRemoved as $messageRemoved) { if ($this->startsWith($record['message'], $messageRemoved)) { return true; } } return false; } /** * Check string start with. */ private function startsWith($string, $startString) { $len = strlen($startString); return (substr($string, 0, $len) === $startString); }
} 

Như bạn có thể thấy ở trên, biến $listMessageRemoved chứa các message mà bạn muốn remove ra khỏi log, cơ chế ở đây là dựa vào method handle(), trả về true có nghĩa là message này đã được xử lí nên nó không cần gửi qua handle tiếp theo (ở đây chính là cloudwatch handler), theo documention:

 /** * Handles a record. * * All records may be passed to this method, and the handler should discard * those that it does not want to handle. * * The return value of this function controls the bubbling process of the handler stack. * Unless the bubbling is interrupted (by returning true), the Logger class will keep on * calling further handlers in the stack with a given log record. * * @param array $record The record to handle * @return bool true means that this handler handled the record, and that bubbling is not permitted. * false means the record was either not processed or that this handler allows bubbling. */ public function handle(array $record);

=> Cuối cùng chúng ta cũng có 1 giải pháp ngon nghẻ, để remove bớt log để tốn tiền khách hàng, hy vọng sẽ giúp ích được cho mọi người 😃

Bình luận

Bài viết tương tự

- vừa được xem lúc

Tạo console với Symfony

Giới thiệu. Tương tự như command artisan Laravel trong Symfony chúng ta có thể tạo ra các command để thực hiện các nghiệp vụ mà chúng ta mong muốn, ví dụ như chúng ta cần update nhiều records hay export csv ... mà không cần đến request của client thay vào đó chúng ta sẽ run CLI (commant line). . Upd

0 0 8

- vừa được xem lúc

[Symfony4] Giải thích cơ chế hoạt động của worker

Phạm vi sử dụng. Symfony là framework gạo cội trong làng PHP, với khá nhiều project xử dụng và custom.

0 0 9

- vừa được xem lúc

Symfony 4 + ECCUBE , làm thế nào để luân chuyển query giữa các node master slave

Mở đầu. Hắn nhiều người trong chúng ta có biết qua master slave node trong RDS , mặc định các framework PHP nổi tiếng như PHP , Symfony đều có hỗ trợ config master slave endpoint, để việc luân chuyển

0 0 17

- vừa được xem lúc

Một số lỗi thường gặp về perfomance trong dự án ECCUBE + php

1.Lỗi không index làm delete query bị slow. Chức năng login có lưu table lock tạm, để xác định số lần nhập sai. . .

0 0 10

- vừa được xem lúc

Triển khai EFK Stack trên Kubernetes

EFK stack on K8S. Giới thiệu. Một hệ thống có thể chạy nhiều dịch vụ hoặc ứng dụng khác nhau, vì vậy việc. theo dõi hệ thống là vô cùng cần thiết.

0 0 54

- vừa được xem lúc

[Spring] - Spring logback config

Trong spring boot có nhiều cách để cấu hình logging. Với mình thì mình thường làm là config trong file aplication.properties hay application.yml hoặc file logback.

0 0 31