Symfony开发环境下如何在Monolog日志中屏蔽404错误
解决Symfony开发环境Monolog记录全量日志但排除404错误的问题
你遇到的问题核心在于fingers_crossed处理器的工作机制:当你把action_level设为debug时,它会把所有级别的日志都转发给下游处理器,这时候excluded_http_codes的过滤逻辑不会生效——因为这个参数只在"触发action_level阈值"的场景下才会判断是否排除请求,而debug级别等于所有请求都会触发,自然拦不住404的日志。
要实现「保留debug/info日志 + 排除404错误」,可以用以下两种配置方案:
方案一:拆分处理器,分离日常日志和错误日志
直接让一个处理器负责输出所有低级别日志,另一个用fingers_crossed处理error及以上但排除404:
monolog: handlers: # 负责输出debug/info等日常日志,直接写入文件 daily: type: rotating_file path: "%kernel.logs_dir%/%kernel.environment%.log" level: debug channels: ["!event"] max_files: 30 # 负责处理error及以上日志,但排除404请求的日志 error_handler: type: fingers_crossed action_level: error handler: nested_error excluded_http_codes: [404] buffer_size: 50 nested_error: type: rotating_file path: "%kernel.logs_dir%/%kernel.environment%.error.log" level: error channels: ["!event"] max_files: 30
这样日常的debug/info会直接写入主日志文件,而error级别的日志只有非404请求才会写入错误日志文件。如果想把所有日志合并到一个文件,也可以让两个处理器指向同一个path,开发环境一般不会有写入并发问题。
方案二:使用filter处理器直接排除404日志
如果希望所有日志都在一个文件里,且直接过滤掉404相关的日志,可以用Monolog的filter处理器配合excluded_http_codes:
monolog: handlers: main: type: filter handler: nested excluded_http_codes: [404] # 允许所有级别日志通过 min_level: debug nested: type: rotating_file path: "%kernel.logs_dir%/%kernel.environment%.log" level: debug channels: ["!event"] max_files: 30
这个方案里,filter处理器会直接拦截所有返回404状态码的请求产生的日志,确保它们不会被写入文件,同时保留其他所有级别的日志。
为什么之前的配置失效?
再回头看你原来的配置:
- 当
action_level: error时,只有error及以上的日志会触发fingers_crossed输出,所以debug/info日志都被缓冲后丢弃了(因为没达到error级别); - 当
action_level: debug时,所有日志都会被输出,excluded_http_codes此时不生效——因为fingers_crossed的这个参数是判断"当请求返回404时,即使达到action_level也不输出",但debug级别下每个请求都达到了阈值,所以404的日志还是会被输出。
内容的提问来源于stack exchange,提问作者Ben87
相关产品推荐
相关产品推荐

