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
组
或者你们对此有其他解决方案
要重现此问题:
- 删除所有storage/logs/*.log文件
- 调用一些不存在的 php artisan 命令,例如:
php artisan make:xy
-> 这将出错并创建一个 .log 文件
- 在浏览器中调用路由 /logout -> 这将尝试写入同一个日志文件并抛出无法写入日志的错误 'Permission denied'
更改 /var/www 文件夹的所有者:
sudo chown www-data:www-data /var/www
(如果您的项目在 /var/www 文件夹下)
如果您需要为 root
.
等不同的用户进行操作,您可以将 www-data 替换为相应的用户级别
在我的项目中,我解决了这个问题,定义了一个自定义记录器,该记录器创建一个日志文件以获取用户名。
在 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;
}
}
编辑 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
已经为我解决了权限冲突。希望这对某人有所帮助!
如果在 运行 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
组
或者你们对此有其他解决方案
要重现此问题:
- 删除所有storage/logs/*.log文件
- 调用一些不存在的 php artisan 命令,例如:
php artisan make:xy
-> 这将出错并创建一个 .log 文件 - 在浏览器中调用路由 /logout -> 这将尝试写入同一个日志文件并抛出无法写入日志的错误 'Permission denied'
更改 /var/www 文件夹的所有者:
sudo chown www-data:www-data /var/www
(如果您的项目在 /var/www 文件夹下)
如果您需要为 root
.
在我的项目中,我解决了这个问题,定义了一个自定义记录器,该记录器创建一个日志文件以获取用户名。
在
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; } }
编辑
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
已经为我解决了权限冲突。希望这对某人有所帮助!