繁体   English   中英

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 -> 这将尝试写入同一个日志文件,并会抛出一个错误,表明它无法写入日志“权限被拒绝”

为此苦苦挣扎了很长时间,并想知道与 OP 相同的事情,后者问:

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

答案是肯定的

config/logging.php我添加了permission => 0666 ,这是我在Laravel 文档中找到的,所以我的日常日志的配置现在看起来像这样:

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

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

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

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

  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 日志记录的默认行为。

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

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

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

对于那些不想要任何额外代码的人,只需通过命令行/终端进入 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM