我在一个类上创建了一个logger方法,基本的日志代码是这样的:
// maximum length of file (in characters / bytes)
$maxlength = 40000;
$filename = "logs/$this->account_id.log";
// add to the first line
$fileContent = file_exists($filename) ? file_get_contents($filename, NULL, NULL, NULL, $maxlength) : "";
file_put_contents($filename, '['.date('d-m-Y- H:i:s').'] - '.$message.PHP_EOL. $fileContent);
它确保首先显示最新的日志条目。所有工作正常,除了一些消息被记录,然后在一段时间后恢复到3天前。
文件有写权限,你知道会发生什么吗?
很可能是并发性问题。每个用户都有一个单独的日志文件,但是用户可能在短时间内发送多个请求,从而达到同时发出多个日志的不希望的结果。您需要在数据库或独立服务中形成某种队列,该队列将接收消息,并且将是唯一负责写入日志文件的东西。
示例解决方案:
- 在需要新的日志时创建一个RDBMS表user_log(account_id, message, timestamp)。这实际上会让系统知道您打算存储一些日志
- 您创建一个cron作业,它将定期查看需要更改的用户日志文件并更改它们