Symfony 2 不支持 log:clear 命令,需手动清理日志;直接删除 var/log/*.log 有权限和句柄丢失风险;应确保 web 服务器用户对 var/log 有写权限,并用 PHP 脚本原子性清理。

log:clear 命令在 Symfony2 中不可用
Symfony 2 没有内置 log:clear 命令——这个命令从 Symfony 3.3 才引入,Symfony 2 的日志清理必须手动操作或自定义命令。直接删 var/log/*.log 文件看似简单,但风险明确:如果 Monolog 正在用 RotatingFileHandler 写入,可能触发 Permission denied 或导致当前日志句柄丢失,新日志写不进文件。
安全做法是复用 Symfony 2 自带的 cache:clear 逻辑思路,但只作用于日志目录:
- 确认
var/log目录归属和权限:web 服务器用户(如www-data)必须有写权限,否则即使脚本执行成功,后续日志也会静默失败 - 用 PHP 脚本替代 shell 删除,确保原子性:
<?php $logDir = __DIR__.'/var/log'; foreach (glob($logDir.'/*.log') as $file) { if (is_writable($file)) { unlink($file); } } - 若使用
RotatingFileHandler(常见于生产配置),它依赖文件名后缀(如prod.log.1,prod.log.2)做轮转,手动删主文件prod.log后,下一次写入会重建,但历史轮转文件需一并清理,否则磁盘仍被占满
如何精简路由输出避免干扰日志内容
默认 php bin/console debug:router 输出全部路由,含大量注释路由、_wdt、_profiler 等开发工具路径,这些与业务无关,却常混在日志分析中干扰判断。真正要查的是你定义的业务路由,比如 /api/users 或 /admin/dashboard。
过滤方法很简单,不用改代码:
- 按名称精确匹配:
php bin/console debug:router user_list(假设路由名是user_list) - 用 grep 提取业务路径:
php bin/console debug:router | grep -E '^\/(api|admin|blog)' - 导出为精简列表供排查:
php bin/console debug:router --format=json | jq -r 'map(select(.path | startswith("/api/") or startswith("/admin/"))) | .[] | "\(.name) \(.path)"'(需安装jq)
注意:Symfony 2 的 debug:router 不支持 --env 参数,它始终读取当前 APP_ENV 配置;若你在 prod 环境运行却看到 dev-only 路由,说明 routing.yml 被全局加载,没按环境拆分。
查看日志时跳过健康检查和静态资源请求
开发时 dev.log 里充斥着 GET /favicon.ico、GET /_wdt/xxx、HEAD /healthz 这类请求日志,它们不是业务行为,却占满屏幕,掩盖真实问题。
实时追踪时可直接过滤:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 排除 favicon 和 profiler:
tail -f var/log/dev.log | grep -v -E 'favicon\.ico|_wdt|_profiler|healthz' - 只看 5xx 错误或慢请求(耗时 >500ms):
tail -f var/log/dev.log | grep -E '(ERROR|50[0-9]|" [45][0-9][0-9] )|time="[^"]*ms.*[5-9][0-9]{2,}' - 若用了 Nginx,更推荐在 Web 服务器层过滤:在
nginx.conf的access_log指令中加if=$loggable变量,把健康检查等路径设为不记录
关键点在于:日志内容由 Monolog 的处理器(handler)决定,不是由路由或控制器决定。即使你删了某个路由,只要中间件或监听器写了日志,它仍会出现——所以过滤动作必须落在日志读取或写入环节,而非路由定义环节。
Monolog 配置中 level 和 handler 的实际影响
很多人以为把 level: debug 写进 monolog.yaml 就能看见所有细节,但实际生效受两层限制:一是通道(channel)绑定,二是处理器(handler)的 level 阈值。
例如这段配置:
monolog:
handlers:
main:
type: stream
path: "%kernel.logs_dir%/%kernel.environment%.log"
level: error
channels: ["!event", "!doctrine"]
它意味着:即使你在控制器里调用 $logger->debug('xxx'),只要该 logger 属于默认 channel(即没显式指定 channel 名),这条日志也不会写入 dev.log,因为 main handler 的 level: error 拒绝了 debug 级别。
正确做法是:
- 开发环境确保至少一个 handler 的
level设为debug,且未用channels排除你的业务 channel - 不要依赖全局
level,而要在每个 handler 里显式声明,因为不同 handler 可以处理不同级别(比如error写文件,debug推送到 Slack) - 若用
rotating_file_handler,注意max_files参数控制保留几个历史文件,设太小会导致轮转过快,设太大则清理不及时
最易被忽略的是:Symfony 2 默认没有 channels 隔离,所有日志走同一个 main handler;升级到 Symfony 3+ 后才默认启用多 channel,所以 Symfony 2 下改 level 必须改对那个唯一生效的 handler。


















