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
1 2 3 4 5 6 | <span class="token key atrule">cloudWatch</span><span class="token punctuation">:</span> <span class="token key atrule">type</span><span class="token punctuation">:</span> service <span class="token key atrule">action_level</span><span class="token punctuation">:</span> <span class="token string">"%env(LOG_LEVEL)%"</span> <span class="token key atrule">id</span><span class="token punctuation">:</span> cloudwatch_handler <span class="token key atrule">channels</span><span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token string">"!event"</span><span class="token punctuation">,</span> <span class="token string">"!doctrine"</span><span class="token punctuation">,</span> <span class="token string">"!php"</span><span class="token punctuation">]</span> |
Các cấp độ setting log level các bạn có thể tham khảo
1 2 3 4 5 6 7 8 9 | <span class="token key atrule">DEBUG</span><span class="token punctuation">:</span> Detailed debug information. <span class="token key atrule">INFO</span><span class="token punctuation">:</span> Interesting events or information. <span class="token key atrule">NOTICE</span><span class="token punctuation">:</span> Normal but significant events. <span class="token key atrule">WARNING</span><span class="token punctuation">:</span> Exceptional occurrences that are not errors. <span class="token key atrule">ERROR</span><span class="token punctuation">:</span> Runtime errors that do not require immediate action. <span class="token key atrule">CRITICAL</span><span class="token punctuation">:</span> Critical conditions. <span class="token key atrule">ALERT</span><span class="token punctuation">:</span> Action must be taken immediately. <span class="token key atrule">EMERGENCY</span><span class="token punctuation">:</span> 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.
1 2 3 4 5 6 7 | <span class="token key atrule">handlers</span><span class="token punctuation">:</span> <span class="token key atrule">main</span><span class="token punctuation">:</span> <span class="token key atrule">type</span><span class="token punctuation">:</span> service <span class="token key atrule">id</span><span class="token punctuation">:</span> monolog.custom_handler.service <span class="token key atrule">level</span><span class="token punctuation">:</span> debug <span class="token key atrule">handler</span><span class="token punctuation">:</span> cloudWatch |
- Trong service.yml thêm define class.
1 2 3 | <span class="token key atrule">monolog.custom_handler.service</span><span class="token punctuation">:</span> <span class="token key atrule">class</span><span class="token punctuation">:</span> CustomizeLogCustomHandler |
- Trong folder Customize/Log thêm class:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">namespace</span> <span class="token package">CustomizeLog</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">MonologHandlerAbstractHandler</span><span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name-definition class-name">CustomHandler</span> <span class="token keyword">extends</span> <span class="token class-name">AbstractHandler</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">handle</span><span class="token punctuation">(</span><span class="token keyword type-hint">array</span> <span class="token variable">$record</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// Check if handling level was reached</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$record</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'level'</span><span class="token punctuation">]</span> <span class="token operator"><</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">level</span><span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token constant boolean">false</span><span class="token punctuation">;</span> <span class="token variable">$listMessageRemoved</span> <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token string single-quoted-string">'INIT'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'PROCESS START'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'PROCESS END'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'User was reloaded'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'Checking support on guard authenticator'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'Guard authenticator does not support the request'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'Checking for guard authentication credentials'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'Read existing security token from the session'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'Stored the security token in the session'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'Matched route'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'LOGIC START'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'LOGIC END'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'Begin Transaction'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'Commit executed'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'fallback to PC layout'</span><span class="token punctuation">,</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token variable">$listMessageRemoved</span> <span class="token keyword">as</span> <span class="token variable">$messageRemoved</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token function">startsWith</span><span class="token punctuation">(</span><span class="token variable">$record</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'message'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token variable">$messageRemoved</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token constant boolean">true</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token constant boolean">false</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">/** * Check string start with. */</span> <span class="token keyword">private</span> <span class="token keyword">function</span> <span class="token function-definition function">startsWith</span><span class="token punctuation">(</span><span class="token variable">$string</span><span class="token punctuation">,</span> <span class="token variable">$startString</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$len</span> <span class="token operator">=</span> <span class="token function">strlen</span><span class="token punctuation">(</span><span class="token variable">$startString</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token punctuation">(</span><span class="token function">substr</span><span class="token punctuation">(</span><span class="token variable">$string</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token variable">$len</span><span class="token punctuation">)</span> <span class="token operator">===</span> <span class="token variable">$startString</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </span> |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <span class="token comment">/** * 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. */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">handle</span><span class="token punctuation">(</span><span class="token keyword type-hint">array</span> <span class="token variable">$record</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
=> 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