Log::info() 无输出主因是 LOG_LEVEL 非 debug,需设为 debug 并重启服务;容器日志应放 boot() 阶段或用 $app['log'];结构化日志需配置 JsonFormatter;追踪解析须用 Container::resolving() 回调。

Log::info() 为什么没输出?先查 LOG_LEVEL
开发环境下 Log::info() 完全不写入日志,90% 是因为 LOG_LEVEL 环境变量不是 debug。Laravel 6 默认生产环境设为 error,连 warning 都会被过滤,更别说 info。
检查方式:在终端运行 php artisan tinker,然后输入 env('LOG_LEVEL') —— 如果返回 "error" 或空值,立刻改 .env:
LOG_LEVEL=debug
改完必须重启队列或 Web 服务(php artisan queue:restart 或重载 PHP-FPM),否则配置不生效。
服务容器绑定/解析过程怎么加日志?别只用 Log::info()
直接在 AppServiceProvider::register() 里写 Log::info() 很容易失败——此时日志系统可能还没完全初始化,Log 门面会报 Target class [log] does not exist 错误。
安全做法是延迟到 boot() 阶段,或改用原始 Monolog 实例:
- 在
boot()中记录:Log::info('Container bound: MyService', ['class' => MyService::class]); - 若必须在
register(),用底层实例:$this->app['log']->info('Binding early'); - 避免在匿名闭包绑定里调用
Log::info(),闭包执行时机不可控,易触发未初始化错误
日志里看不到上下文数据?检查 channel 配置是否支持结构化输出
Log::info('user.login', ['user_id' => 123, 'ip' => $request->ip()]) 写进去后,日志文件里只显示字符串、没有键值对?那是你用的 channel 不支持 context 渲染。
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
Laravel 6 默认 stack 通道依赖底层 Monolog 的 LineFormatter,它默认把 context 打平成字符串,但字段名会丢失。要保留结构,得改 config/logging.php:
- 用
daily或single驱动时,确保'formatter' => \Monolog\Formatter\JsonFormatter::class - 或者自定义 formatter,在
'with' => []里注入'json' => true参数 - 别用
syslog或errorlog驱动——它们天生丢 context
改完清配置缓存:php artisan config:clear,否则新 formatter 不加载。
想追踪某个服务被谁解析过?用 Container::resolving() + 日志
单纯靠 Log::info() 埋点,很难知道「谁在什么时候解析了这个类」。Laravel 容器提供 resolving() 回调,可精准捕获每次解析动作:
$this->app->resolving(MyService::class, function ($service, $app) {
Log::debug('MyService resolved', [
'called_by' => debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2)[1]['function'] ?? 'unknown',
'timestamp' => now()->toISOString(),
]);
});
注意两点:
- 这段代码必须放在
boot(),不能放register(),否则回调注册不上 -
debug_backtrace()开销不小,仅限调试期启用;上线前删掉或用配置开关包裹 - 如果解析链很深(比如 A → B → C → MyService),单靠
[1]['function']可能不够,需增加层级或记录class
最常被忽略的是:resolving() 不触发继承关系,resolving('Illuminate\Contracts\Mail\Mailer') 不会捕获 MailManager 的解析,必须指定具体实现类或接口全名。

















