Symfony日志级别设置采用通道+处理器双重控制,遵循RFC 5424标准共8级,常用DEBUG/INFO/WARNING/ERROR;各handler可独立设level并绑定channel,实现差异化过滤与多级分流。

Symfony日志级别设置核心在于按通道(channel)+按处理器(handler)双重控制,不是全局一刀切。你既可以在 handler 上设最低记录级别,也能为不同 channel 绑定不同 handler 实现差异化过滤。
日志级别有哪些及对应用途
Symfony 遵循 RFC 5424 标准,共 8 级,常用的是以下 4 级:
- DEBUG:开发调试用,比如变量值、执行路径,生产环境应禁用
- INFO:关键业务事件,如“用户注册成功”“订单创建完成”
- WARNING:非错误但需关注,如缓存未命中、配置回退使用默认值
- ERROR:运行时异常,如数据库查询失败、HTTP 请求超时,程序仍可继续
在配置中设置 handler 级别
每个 handler 可独立指定 level,低于该级别的日志不会被它处理。例如:
monolog:
handlers:
app_file:
type: stream
path: "%kernel.logs_dir%/app.log"
level: info
channels: ["app"]
<pre class="brush:php;toolbar:false;">security_file:
type: stream
path: "%kernel.logs_dir%/security.log"
level: warning
channels: ["security"]
这意味着:
- 所有
app通道的info及以上(info、warning、error…)写入app.log - 只有
security通道的warning及以上才写入security.log,info级别会被跳过
实现同一通道内多级分流(进阶)
若想对同一个 channel(如 app)做更细粒度控制——比如 debug 日志只输出到控制台,error 日志同时发邮件+写文件——可用 fingers_crossed 或组合多个 handler:
monolog:
handlers:
console_debug:
type: console
level: debug
channels: ["app"]
bubble: false
<pre class="brush:php;toolbar:false;">error_mail:
type: fingers_crossed
action_level: error
handler: nested
channels: ["app"]
nested:
type: group
members: [file_error, mail_alert]
file_error:
type: stream
path: "%kernel.logs_dir%/error.log"
level: error
mail_alert:
type: swift_mailer
from_email: "alert@example.com"
to_email: "admin@example.com"
subject: "Symfony ERROR Alert"
level: error
这样:app 的 debug 日志只走控制台;一旦出现 error,fingers_crossed 触发,把本次请求中所有日志(含之前的 debug/info)一并交由 file_error 和 mail_alert 处理。
代码中触发日志时注意级别语义
调用方式本身不决定是否记录,最终是否落盘/发送,取决于目标 handler 的 level 和绑定的 channels:
// 控制器中
public function index(LoggerInterface $logger)
{
$logger->debug('数据库查询耗时:120ms', ['query' => 'SELECT * FROM users']);
$logger->info('用户访问首页', ['user_id' => 123]);
$logger->warning('API 响应延迟超过阈值', ['latency_ms' => 2100]);
}
只要这些日志发往的 handler 允许对应级别(如 level: info 的 handler 就不会收到 debug),就不会被处理。不需要在代码里写 if 判断级别。











