首页 > 代码库 > 为什么日志记录到别的目录了?

为什么日志记录到别的目录了?

登录到服务器查看的时候,发现工作目录中有很多日志文件和core文件

pwd : /home/work/anti

-rw-rw-r-- 1 work work 2738 Jul 18 21:22 14_07_18.log
-rw-rw-r-- 1 work work 1829 Jul 19 02:35 14_07_19.log
-rw-rw-r-- 1 work work 1590 Jul 21 06:40 14_07_21.log
-rw-rw-r-- 1 work work 1884 Jul 22 17:03 14_07_22.log
-rw-rw-r-- 1 work work 1745 Jul 23 12:11 14_07_23.log

-rw------- 1 work work 127094784 Jul 8 17:42 core.15330
-rw------- 1 work work 353038336 Jul 8 17:33 core.22368

项目的日志文件并没有指定到这个位置呀,开始怀疑是配置错了,于是找php.ini,thinkphp框架的配置文件,php-fpm.conf等相关的配置文件

还是没有发现哪个地方配置了日志要写到这个目录

于是追原因,我发现thinkphp框架写日志的时候,最终会落到一个函数

Protected/ThinkPHP/Library/Think/Log/Driver/File.class.php

public function write($log,$destination=‘‘) {...

var_dump($destination);

其中$destination是日志的位置,于是用上面红色的代码打印变量如下:

有两种情况:

情况1,日志正确的位置 :/home/work/huangxuan/anti/Protected/Application/Runtime/Logs/14_07_25.log

情况2,日志错误的位置 :14_07_25.log

我们发现日志之所以出现在了错误的位置,是因为参数只有一个日志名,没有路径。但为什么这样呢?

原来把14_07_25.log参数传递给PHP时,PHP调用操作系统写日志的时候,把14_07_25.log传递给了操作系统,操作系统发现14_07_25.log是个相对路径,就会以当前程序运行的目录为参照物,形成绝对路径,于是日志就写在我的工作目录中了。

我们知道一个程序运行的时候,会有一个运行目录,默认我们程序在哪里启动,哪里就是它的工作目录,因为我们的php-fpm进程是在我的工作目录中启动,所以我的工作目录就变成了它的工作目录。

这同时也解释了为什么core文件也同时产生在我的工作目录。

为了验证我的想法,我把php-fpm进程kill掉,在别的目录重新启动php-fpm进程,日志果然产生在了别的目录中;同时我们kill -SIGSEGV 8888(php-fpm的pid),来模拟程序段错误(段错误的时候会生成core文件),果然一个core文件也产生了。

至于为什么thinkphp有时候会传递一个相对路径,有时候会传递一个绝对路径呢?我实在是不想找原因了。。。