【问题标题】:Laravel log file permission problemsLaravel 日志文件权限问题
【发布时间】:2019-12-06 03:40:16
【问题描述】:

如果在运行php artisan 命令时出现错误,日志文件将如下创建:

 -rw-rw-r-- 1 user www-data 2,2K Jul 28 18:08 laravel-2019-07-28.log

如果通过网络浏览器使用应用程序时出现错误,日志文件将如下创建:

-rw-r--r-- 1 www-data www-data 2,2K Jul 28 16:10 laravel-2019-07-28.log

www-data 创建原始文件后,如果php artisan 命令出错, 它将抛出错误Permission denied,因为它无法写入日志

有没有办法为新创建的文件设置默认 chmod,以便它们始终拥有rw 用于组 或者你们有其他解决方案

重现此问题:

  1. 删除所有存储/日志/*.log 文件
  2. 调用一些不存在的 php artisan 命令,例如:php artisan make:xy -> 这会出错并创建一个 .log 文件
  3. 在浏览器/logout 中调用路由 -> 这将尝试写入同一个日志文件,并会抛出无法写入日志“权限被拒绝”的错误

【问题讨论】:

  • 似乎您正在以不同的用户身份运行 artisan 和您的网络服务器
  • 当然......你如何运行你的工匠命令?作为 www-data 用户???
  • 你试过 sudo -u www-data php artisan 吗?
  • 不,我没有,这可能会以 www-data 用户的身份创建一个文件,但它似乎有点像运行 sudo -u www-data php artisan 的皮塔饼,你不这么认为吗?
  • 对我来说,队列在后台执行时失败,因为后台工作人员由于权限问题无法登录日志文件,在“config/logging”中添加“permission”=> 0755 后它可以工作.php" 文件,位于日志频道(每日频道)

标签: laravel user-permissions


【解决方案1】:

为此苦苦挣扎了很长时间,并且想知道和OP一样的事情,他问:

有没有办法为新创建的文件设置默认 chmod,以便它们始终具有 rw 用于组

答案是是的

config/logging.php 中我添加了permission => 0666,这是我在Laravel docs 中找到的,所以我的每日日志的配置现在如下所示:

'daily' => [
   'driver' => 'daily',
   'path' => storage_path('logs/laravel.log'),
   'level' => 'debug',
   'days' => 14,
   'permission' => 0666,
],

需要明确的是,0664 已经足以将组权限设置为rw,但这仍然会导致权限错误。

0666 为我解决了权限冲突。希望这对某人有帮助!

【讨论】:

  • 谢谢,这适用于 laravel 5.8(我添加了 'permission' => 0775 )
  • 我关注在我的 CentOS 上工作的 @ChardenDaxicen
  • 终于,这在 laravel 8 上工作了。谢谢
【解决方案2】:

在我的项目中,我解决了这个问题,定义了一个自定义记录器,该记录器创建一个到达用户名的日志文件。

  1. app/Logging/UserNamedLogger.php 上创建自定义记录器:

    <?php
    
    
    namespace App\Logging;
    
    use Monolog\Handler\RotatingFileHandler;
    use Monolog\Handler\SyslogHandler;
    use Monolog\Logger;
    
    class UserNamedLogger
    {
        /**
         * Create a custom Monolog instance.
         *
         * @param  array  $config
         * @return \Monolog\Logger
         */
        public function __invoke(array $config)
        {
            $logger = new Logger('UserNamedLogger');
    
            // Configure Monolog to log on user named log files
            $filename = storage_path('logs/laravel-'.  posix_getpwuid(posix_geteuid())['name'] .'.log');
            $rotatingHandler = new RotatingFileHandler($filename);
            $logger->pushHandler($rotatingHandler);
    
            return $logger;
        }
    }
    
  2. 编辑config/logging.php 配置文件:

'channels' 键中,添加您的自定义记录器:

    'named' => [
        'driver' => 'custom',
        'via' => App\Logging\UserNamedLogger::class,
    ],

并将默认记录器更改为named 频道:

    'default' => env('LOG_CHANNEL', 'named'),

现在,每次您的工匠(或计划的工作)运行时,它都会登录到您的 www 服务器所做的不同文件。这解决了权限问题。

Imo,这应该是 Laravel 日志记录的默认行为。

【讨论】:

  • 非常有趣的解决方案,所以创建的每个日志文件都存储在单独的文件中,并且不会与用户权限冲突?
  • 正是@lewis4u。你可以用类似的代码做一些很酷的事情。如果您喜欢,请考虑接受此答案!
  • 也感谢您的编辑。我是在移动设备上写的,不幸的是,stackoverflow 没有用于在移动设备上设置代码样式的按钮。
  • 这也适用于 Laravel 5.3 吗?请回复!
  • 是的。我在 Laravel 5.8 应用程序中使用相同的解决方案
【解决方案3】:

更改 /var/www 文件夹的所有者:

sudo chown www-data:www-data /var/www(如果你的项目在 /var/www 文件夹下)

如果您需要为不同的用户(如root)替换 www-data,您可以将 www-data 替换为相应的用户级别。

【讨论】:

  • 这行不通。问题是日志文件是每天的,如果当天的第一条日志消息来自 www-data,工匠将无法记录任何内容。如果 artisan 是第一个写日志消息的人,同样适用。
  • 这对我有用,因为此命令是更改该项目文件夹的所有者,包括文件夹中的所有文件。你可以试试看。如果我仍然错了,请纠正我。
  • 该文件是作为运行 php.ini 的用户创建的。当您以 someusername 运行 php artisan 时,日志文件将属于 someusername,而不是 www-data。 (php 不能用另一个用户名创建文件,除非它是 root)
  • @EliasSoares 是对的。仅当您在日志中已有文件而不是新创建的文件时,这才有效!
【解决方案4】:

对于那些不想要任何额外代码的人,只需通过命令行/终端进入 laravel 存储文件夹并运行以下 3 个命令:

设置默认组 www-data

find logs -type d -exec chgrp www-data {} +

设置在当前目录下创建的所有新文件和子文件夹都继承目录所属的组

find logs -type d -exec chmod g+s {} +

如果用户创建一个文件,它将具有 rw-rw-r 权限

sudo setfacl -R -d -m u::rw logs

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-15
    • 1970-01-01
    • 2018-02-03
    • 1970-01-01
    • 2013-04-12
    • 1970-01-01
    • 2021-06-19
    • 2023-03-24
    相关资源
    最近更新 更多