Laravel 日志文件权限问题

Laravel log file permission problems

如果在 运行 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. 删除所有storage/logs/*.log文件
  2. 调用一些不存在的 php artisan 命令,例如:php artisan make:xy -> 这将出错并创建一个 .log 文件
  3. 在浏览器中调用路由 /logout -> 这将尝试写入同一个日志文件并抛出无法写入日志的错误 'Permission denied'

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

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

如果您需要为 root.

等不同的用户进行操作,您可以将 www-data 替换为相应的用户级别

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

  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'),

现在每次您的 artisan(或预定作业)运行时,它都会登录您的 www 服务器登录的不同文件。这解决了权限问题。

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

对于那些不需要任何额外代码的人,只需通过命令 line/terminal 和 运行 这 3 个命令进入 laravel 存储文件夹:

设置默认组 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

为此苦苦挣扎了很长时间,想知道与 OP 相同的问题,他问:

Is there a way to set default chmod for NEW created files, so that they always have rw for group

答案是

我在 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 已经为我解决了权限冲突。希望这对某人有所帮助!