Laravel日志时间异常求助:已设Europe/Stockholm时区仍差2小时
我之前在Valet环境下也碰到过一模一样的问题,折腾了好一会儿才找到根源,给你几个靠谱的排查和解决方向:
给日志通道单独指定时区
别以为在config/app.php里设置了应用时区就万事大吉了——Laravel的日志组件(Monolog)默认可能会优先用服务器/系统时区,而非应用时区。从Laravel 8版本开始,你可以直接在config/logging.php里为日志通道单独配置时区:
打开config/logging.php,找到你正在用的日志通道(比如默认的stack或者single),加上一行'timezone' => 'Europe/Stockholm'就行,示例代码:'channels' => [ 'stack' => [ 'driver' => 'stack', 'channels' => ['single'], 'ignore_exceptions' => false, 'timezone' => 'Europe/Stockholm', // 新增这行配置 ], // 其他日志通道也可以按这个方式设置 ],必须清除配置缓存!
很多人修改了配置文件后忘了清缓存,结果新设置根本不生效。在终端里跑一下这个命令:php artisan config:clear如果你之前执行过
php artisan config:cache,那这一步更是必不可少——缓存的配置会直接覆盖你修改的文件内容,等于白改。检查Valet的PHP环境时区
Valet用的PHP环境时区可能和你预期的不一样。你可以在项目根目录临时创建一个phpinfo.php文件,内容就一行:<?php phpinfo(); ?>访问这个文件,搜索
date.timezone,看看它的值是不是Europe/Stockholm。如果不是,就去修改对应PHP版本的php.ini文件(路径可以在phpinfo里的Loaded Configuration File找到),把date.timezone改成Europe/Stockholm,然后重启Valet:valet restart确认系统时区是否正确
如果你是用MacOS(Valet主要适配Mac),去系统偏好设置→日期与时间里看看,系统时区是不是选的斯德哥尔摩。虽然Laravel理论上会优先用应用配置,但有时候系统时区会影响底层的日志时间戳生成,确认一下没坏处。
内容的提问来源于stack exchange,提问作者Kiow

