在平衡服务器上处理 Laravel 中的日志记录

fud*_*udo 5 logging load-balancing laravel

我的 Laravel 应用程序有 2 个平衡服务器,但每个服务器都登录到自己的目标文件夹(我们使用每日文件日志记录):有没有办法有一个集中位置来保存日志?

我已经安排了日志记录配置以在输出中包含服务器名称,但我不知道如何处理这种情况。

也许是对象存储?或者是什么?非第三方解决方案会更好,我们希望将所有内容保留在 Laravel 和我们的服务器内,但如果别无选择,我们将安排外部解决方案。

apo*_*fos 2

现在可能没有“最佳”方法来做到这一点,并且 Laravel 在如何做到这一点上提供了很大的灵活性(如果您查看文档。事实上,由于支持 NewRelic,如果您已经在使用 NewRelic,这可能是解决此问题的一个不错的方法。

我们使用数据库来记录日志。我们可以这样做,因为数据库托管在服务器外部,但位于 AWS 的同一 VPC 中,这意味着延迟非常低。我们有一个表格,其中id, message, detail, created_at, severity有一个简单的方法:

在您的EventServiceProvider(任何服务提供商都可以真正工作)

Event::listen(MessageLogged::class, function (MessageLogged $messageLogged) {
      [ $level, $message, $context ] = [ $messageLogged->level, $messageLogged->message, $messageLogged->context ];
      if (!\Log::getLogger()->isHandling(Logger::toMonologLevel($level))) {
            return; // Don't log if the logger isn't actually handling this level
      }
      if (($message instanceof \Exception || $message instanceof \Throwable)) {
          $context = [$message];
          $message = $message->getMessage();
      }
      DB::table('log')->insert([
          'message' => $message
          'detail' => implode(PHP_EOL, $context ?: []),
          'created_at' => Carbon::now(),
          'severity' => $level
      ]);
});
Run Code Online (Sandbox Code Playgroud)

如果性能是一个问题,您还可以创建一个任务来对日志事件的处理进行排队,但这意味着您必须按照事件发生的时间而不是处理事件的时间对其进行排队。