Laravel 使用 root:root 代替 webapp:webapp 创建的日志文件

Posted

技术标签:

【中文标题】Laravel 使用 root:root 代替 webapp:webapp 创建的日志文件【英文标题】:Laravel log file created with root:root instead of webapp:webapp 【发布时间】:2015-07-17 10:46:47 【问题描述】:

在我的应用程序中,我使用每天 00:00 UTC 创建的 laravel.log 文件。但是,有时该文件是使用 root:root 用户/组而不是通常的 webapp:webapp (apache 用户)创建的。这会使我的应用程序崩溃,因为应用程序无法再写入它。我注意到在文件写入一段时间(几分钟)后,文件所有权可能会发生变化。

    什么可能导致文件的所有权在创建后发生更改? Laravel 中是否有办法尝试/捕获日志记录,以使应用程序不会因文件写入错误而崩溃?

存储目录和文件的权限不是问题,因为它已经运行了很长时间。只是 laravel.log 文件的所有权偶尔会在没有干预的情况下发生变化。

【问题讨论】:

您是否以 root 身份运行您的 crons?您应该考虑在存储目录上使用 ACL 以确保 Web 服务器始终具有访问权限。 听起来每天运行的创建日志文件的任何进程都由(或作为)root执行。 【参考方案1】:

您应该使用 php_sapi_name() 而不是 get_current_user()。正如 Jason 在您尝试过的相同答案的评论中所解释的那样。

请注意 get_current_user() 返回当前 PHP 脚本的所有者(根据 php.net),而不是当前运行脚本的用户。我改用 php_sapi_name(),它给出了 php 处理程序的名称(例如 apache 或 cli),它们往往会以不同的用户身份运行。

这样您将获得 2 个单独的 Web 服务器和命令行日志(包括队列侦听器)。

【讨论】:

谢谢@Vikas。自发布以来已经有一段时间了,我对队列的实现方式以及日志文件的生成方式进行了一些架构更改。这对我来说不再是问题。我使用 cron 提前创建具有适当权限的日志文件,这样就永远不会使用错误的权限创建它。但我很欣赏这个答案,它可能会派上用场一段时间。【参考方案2】:

找到解决方案here。

他的解决方案让我意识到问题出在我的队列监听器上。在极少数情况下,当我的 Web 应用程序有机会在 UTC 午夜后(几分钟内)轮换日志文件之前我的队列侦听器启动时,该文件是以 root 所有者身份创建的。

我修改了日志文件名以包含当前用户,从而隔离每个用户的日志,避免任何权限问题。

【讨论】:

好的,这就是交易。这没有用!我将文件名修改为 "laravel" 。获取当前用户()。建议的“.log”。我的日志文件现在命名为“laravelwebapp.log”。但是,该文件以“root:root”所有权再次创建,并且仍然具有文件名“laravelwebapp.log”,而当它使用 root 所有者创建时,我希望它是“laravelroot.log”。我不知道这里发生了什么。有人帮忙吗?

以上是关于Laravel 使用 root:root 代替 webapp:webapp 创建的日志文件的主要内容,如果未能解决你的问题,请参考以下文章

什么是Vagrant Homestead root密码?

VIM扩展命令模式

shell三剑客练习 05

Laravel 5:使用 SHA1 代替 Bcrypt

Linux用户和密码文件格式详解

drwxr-xr-x 2 root root 4096 06-29 14:30 Test 分段解释