Laravel 10中Debug模式与日志配置分离:APP_DEBUG仅控制HTML错误页显示,不作用于API;日志由config/logging.php统一管理,推荐生产用stack驱动组合daily+告警通道;API调试应通过X-Debug-API请求头动态启用,SQL日志仅开发按需开启。

在 Laravel 10 中,日志和 Debug 模式是两个独立但常配合使用的配置项。Debug 模式控制错误详情是否显示(仅对 HTML 响应生效),而日志配置决定错误和调试信息如何记录、存到哪里、保留多久。两者都需按环境区分对待,开发时开得细,生产必须严格收敛。
Debug 模式:只在本地开启,不提交到生产
Debug 模式由 APP_DEBUG 控制,它只影响异常页面的渲染(比如 Whoops 错误页),对 API 返回的 JSON 没有默认增强效果。
- 在 .env 文件中设置:
APP_DEBUG=true(开发)或APP_DEBUG=false(生产) - 该值最终被读入
config/app.php的'debug' => env('APP_DEBUG', false) - 切勿在生产环境设为 true——会暴露环境变量、路径、数据库配置等敏感信息
- API 接口即使开了 APP_DEBUG,也不会自动返回 trace;如需调试字段,需手动注入响应(见下文)
日志通道:用 config/logging.php 统一管理
Laravel 10 的日志核心配置已完全移至 config/logging.php,config/app.php 中的 log 和 log_level 已废弃(旧项目迁移时需删除)。
- 默认通道由 .env 中的
LOG_CHANNEL=stack指定 - 推荐生产环境使用
stack驱动,组合多个通道,例如同时写 daily 文件 + 推送 error 到 Slack - 常见驱动示例:
-
daily:按天分割,路径storage/logs/laravel-2026-09-17.log,适合归档排查 -
single:所有日志写进一个文件,开发快速查看可用 -
slack或papertrail:用于告警通知,需额外配置 webhook 或 endpoint
-
- 每个通道可单独设
level,例如'level' => env('LOG_LEVEL', 'debug'),生产建议设为warning或error
API 调试不靠 APP_DEBUG:用中间件动态开启
全局开 APP_DEBUG 对 API 无效,且风险高。更安全的做法是通过请求头临时启用当前请求的调试逻辑。
- 创建中间件
app/Http/Middleware/EnableApiDebug.php,检查X-Debug-API: 1头 - 在中间件中执行:
config(['app.debug' => true])(仅当前请求生效) - 同时切换日志栈:
\Log::stack(['daily', 'debug']),把调试日志单独写入debug.log - 注册该中间件到
routes/api.php的路由组,**不要放 web 组里** - 在异常处理器
app/Exceptions/Handler.php的render()方法中,当config('app.debug') && $request->is('api/*')时,向响应体添加轻量debug字段(不含 file/line/trace)
SQL 查询日志:按需启用,避免常开
查询日志不走主日志系统,需单独开启,且仅限开发阶段使用。
- 临时启用(单请求):
DB::enableQueryLog()+DB::getQueryLog() - 全局启用(仅 local 环境):在
config/database.php对应连接中加'logging' => true(Laravel 10.30+ 支持) - 监听式记录(推荐):在
AppServiceProvider@register()中调用DB::listen(),可过滤、打标、写入自定义日志文件 - 生产环境禁用——性能损耗明显,且可能泄露 SQL 和参数


















