最近在一个项目上发现一个很奇怪的问题:thinkphp命令行的日志输出很正常,但是在runtime目录中却找不到网站的访问日志。而之前网站访问日志一直是没问题的,思前想后也没感觉最近有哪些修改会影响到日志的输出。
“runtime/log”目录如下图所示,thinkphp5突然就没了访问日志。
排查步骤:
1、检查开发模式是否开启。这一步不再详细描述。有的是env文件,有的是app.php配置文件,遇到此类问题的小伙伴可以自行排查。这不是本文的重点,因为这个日志之前一直是有输出的,只是突然没有访问日志了。
2、目录权限排查。
代码能否输出一个文件,目录权限有着绝对的关系。通过细心的排查我们发现以往的日志目录权限都是“www”用户,访问权限为“644”,而最新一个月的日志目录权限变成了“root”。
这就难怪!www用户无法输出文件到root用户的目录了。但是cli日志一直正常,说明thinkphp的命令行是以“root”权限运行的。
找到问题的根源了,就容易解决它。我们需要找到日志的文件输出驱动,改造其代码即可。
- //解决log无法输出的问题
- if(!is_file($destination)){
- $first = true;
- }
- $ret = error_log($message, 3, $destination);
- try {
- if(isset($first) && is_file($destination)) {
- chmod($destination, 0755);
- unset($first);
- }
- } catch (\Exception $e) { }
- return $ret;
我们找到“/thinkphp/library/think/log/driver/File.php”文件,将上述代码复制,放在Write方法中即可。
至此问题终于得到解决。