Nhật ký hàng ngày của Laravel được tạo với quyền sai


112

Tôi có một tập lệnh mà tôi chạy bằng php Artian (với người dùng root ) và đôi khi nó khiến tệp nhật ký hàng ngày được tạo trước khi người dùng apache www-data thực hiện - điều đó có nghĩa là khi người dùng thực sử dụng ứng dụng web của tôi, tôi nhận được lỗi quyền thư mục:

Không mở được luồng: Quyền bị từ chối

Tôi luôn thay đổi quyền trở lại www-data nhưng tôi muốn giải quyết vấn đề này bằng cách luôn tạo tệp nhật ký với các quyền chính xác.

Tôi đã cân nhắc việc tạo cron job tạo tệp hoặc chạm vào nó để đảm bảo nó có quyền phù hợp hàng ngày, nhưng tôi đang tìm kiếm một giải pháp tốt hơn mà không dựa vào tập lệnh khác.

Chúng tôi cũng đã xem xét gói php artist trong một tập lệnh khác để đảm bảo rằng nó luôn chạy với thông tin xác thực www-data , nhưng điều mà chúng tôi muốn làm thực sự là các thủ tục gốc mà apache không được phép làm.

Có thêm đề xuất nào không?


Thiết lập một croncông việc cho touchmột tệp nhật ký mới vào lúc nửa đêm hàng ngày (tất nhiên là với đúng người dùng).
Ben Harold

@BenHarold Cảm ơn, chúng tôi đã xem xét điều đó nhưng tôi không muốn liên quan đến nhiều tập lệnh hơn.
NiRR

2
Trong trường hợp đó, bạn sẽ cần chạy php artisanvới tư cách người dùng mà bạn muốn tạo tệp nhật ký.
Ben Harold

@BenHarold Một lần nữa, cảm ơn, chúng tôi cũng đã xem xét điều đó, đó có lẽ là cách tốt nhất để đi, nhưng tôi đã cập nhật câu hỏi để giải thích tại sao điều này cũng không lý tưởng.
NiRR

2
Điều làm việc cho tôi là thực thi cron với tư cách là người dùng www-data vớisudo crontab -u www-data -e
Nil Llisterri,

Câu trả lời:


67

Hãy bắt đầu với những gì là hằng số.

Bạn có một php artisanlệnh, điều hành root.

Có thể an toàn khi giả định rằng lệnh này được thực hiện hàng ngày.

Giải pháp số 1:

Giả sử rằng người dùng tạo tệp là người có quyền ghi vào tệp theo mặc định, chúng tôi có thể tách các nhật ký theo người dùng như sau:

App/start/global.php

/*
|--------------------------------------------------------------------------
| Application Error Logger
|--------------------------------------------------------------------------
|
| Here we will configure the error logger setup for the application which
| is built on top of the wonderful Monolog library. By default we will
| build a basic log file setup which creates a single file for logs.
|
*/

Log::useDailyFiles(storage_path().'/logs/laravel-'.get_current_user().'.log');

Nếu bạn www-data sử dụng là để tạo ra một bản ghi lỗi, nó sẽ cho kết quả: storage/logs/laravel-www-data-2015-4-27.log.

Nếu bạn gốc sử dụng là để tạo ra một bản ghi lỗi, nó sẽ cho kết quả: storage/logs/laravel-root-2015-4-27.log.

Giải pháp số 2:

Thay đổi nhật ký được sử dụng bởi lệnh thủ công của bạn, trong tập lệnh php của bạn.

Trong run()hàm của bạn , hãy thêm dòng này vào đầu:

Log::useFiles(storage_path().'/logs/laravel-'.__CLASS__.'-'.Carbon::now()->format('Y-m-d').'.log');

Nếu tên lớp của bạn là ArtisanRunner, thì tệp nhật ký của bạn sẽ là:

storage/logs/laravel-ArtisanRunner-2015-4-27.log.

Kết luận: Giải pháp số 1 tốt hơn, vì nó phân định nhật ký của bạn theo người dùng và do đó sẽ không có lỗi nào xảy ra.

CHỈNH SỬA: Như đã chỉ ra bởi jason, get_current_user()trả về tên chủ sở hữu của tập lệnh. Do đó, để áp dụng giải pháp số 1, chownlớp nghệ nhân của bạn phải gửi tên người dùng bắt buộc.


12
Xin lưu ý rằng get_current_user()trả về chủ sở hữu của tập lệnh PHP hiện tại (theo php.net) chứ không phải người dùng hiện đang chạy tập lệnh. php_sapi_name()Thay vào đó, tôi sử dụng , tên của trình xử lý php (ví dụ: apache hoặc cli) sẽ có xu hướng được chạy như những người dùng khác nhau.
Jason

1
Tôi có thể đưa ra đề xuất sử dụng cả tên người dùng thực thi tập lệnh và php_sapi_name kết hợp không vì nhiều người dùng có thể thực thi Laravel từ CLI, ví dụ một vài DBA truy cập vào máy chủ của bạn hoặc bạn có thể muốn CRON Laravel chạy dưới dạng apache. Bạn có thể lấy tên tiến trình thực thi tập lệnh này bằng cách sử dụng posix_getpwuid (posix_geteuid ()) ['name']; Xem bài viết đầy đủ của tôi dưới đây.
Andrew

Điều này cần được cập nhật cho các phiên bản Laravel mới nhất: v5 +
Andrew

106

Phiên bản Laravel 5.6.10 trở lên có hỗ trợ một permissionphần tử trong cấu hình ( config/logging.php) cho singledailytrình điều khiển:

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

Không cần phải tung hứng với Monolog trong tập lệnh bootstrap.

Cụ thể, hỗ trợ đã được thêm vào https://github.com/laravel/framework/commit/4d31633dca9594c9121afbbaa0190210de28fed8 .


9
cái này phải có trong tài liệu chính thức!
odupont

3
dấu nháy đơn bị thiếu trong câu trả lời này. Nó phải là 'quyền' => '0664'. Thì câu trả lời này là hoàn toàn ổn!
Phil

2
@Phil Nope - đây chỉ là một trình bao bọc cho trình xử lý luồng Monologs chấp nhận một int cho quyền. Monolog kết thúc tốt đẹp php.net/manual/en/function.chmod.php - lưu ý rằng một 0 hàng đầu là cần thiết để đảm bảo nó là một giá trị bát phân
Chris

7
'permission' => 0664làm việc cho tôi (không có dấu ngoặc kép)
Syclone

2
@Friedrich nếu tệp nhật ký của bạn đang được tạo bằng 'root' là chủ sở hữu của tệp, điều đó có khả năng báo hiệu rằng bạn gặp vấn đề lớn hơn về cách máy chủ web của bạn được thiết lập
kjones

62

Đối với Laravel 5.1, tôi sử dụng phần sau ở cuối bootstrap/app.php(như đã đề cập trong tài liệu ):

/**
 * Configure Monolog.
 */
$app->configureMonologUsing(function(Monolog\Logger $monolog) {
    $filename = storage_path('logs/laravel-'.php_sapi_name().'.log');
    $handler = new Monolog\Handler\RotatingFileHandler($filename);
    $monolog->pushHandler($handler);
});

Tất nhiên, có rất nhiều Trình xử lý khác mà bạn có thể sử dụng.


1
Tôi thực sự thích câu trả lời này vì 1) nó được cập nhật lên 5.1 và 2) sử dụng một phương thức trong tài liệu để mở rộng hành vi nhật ký.
Dylan Pierce

Tuyệt vời, không cần thêm đèn flash phía trước nhưng vẫn hoạt động. Nó sẽ đọc ... $ filename = storage_path ('logs / laravel -'. Php_sapi_name (). '. Log');
Andrew

Tôi có thể đưa ra đề xuất sử dụng cả tên người dùng thực thi tập lệnh và php_sapi_name kết hợp không vì nhiều người dùng có thể thực thi Laravel từ CLI, ví dụ một vài DBA truy cập vào máy chủ của bạn hoặc bạn có thể muốn CRON Laravel chạy dưới dạng apache. Bạn có thể lấy tên tiến trình thực thi tập lệnh này bằng cách sử dụng posix_getpwuid (posix_geteuid ()) ['name']; Xem bài viết đầy đủ của tôi dưới đây.
Andrew

1
Làm thế nào để sử dụng nó trong Laravel 5.6? Bởi vì Laravel 5.6 có một hệ thống Ghi nhật ký hoàn toàn mới.
Hamed Kamrava

26

Với những mục đích như vậy, bạn nên sử dụng ACL nâng cao trên các tệp và thư mục của mình. setfaclsẽ là câu trả lời của bạn ở đây. Nếu bạn muốn cấp quyền cho người dùng www-data để ghi trên các tệp của root trong thư mục cụ thể, bạn có thể thực hiện như sau:

setfacl -d -m default:www-data:you-chosen-group:rwx /my/folder

Sau khi ban hành điều này, bạn sẽ đặt quyền rwxcho người dùng www-data trên tất cả các tệp cho /my/folder/dù ai đã tạo các tệp đó. Xin vui lòng, xem nàycâu hỏi này để tham khảo. Ngoài ra, bạn có thể kiểm tra tài liệu chosetfacl .

Hãy cho tôi biết nếu điều này sẽ giúp.


3
Lệnh sau phù hợp với tôi: setfacl -d -m g:www-data:rw /full/path/to/laravel/storage/logstheo sau là php artisan cache:clearcomposer dump-autoload.
Sawny

17

Tôi đã làm việc này theo cách rất đơn giản:

Tôi gặp phải vấn đề tương tự trên Laravel 5.6

Trong config/logging.phptôi vừa cập nhật giá trị đường dẫn của kênh hàng ngày với php_sapi_name()trong đó.

Điều này tạo ra sự riêng biệt cho các php_sapi_name khác nhau và đặt tệp nhật ký có dấu thời gian vào thư mục perticular của chúng.

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

Đối với tôi,

  • Các tệp nhật ký được tạo trong fpm-fcgithư mục: Nhật ký từ trang web,owner: www-data
  • Các tệp nhật ký được tạo trong clithư mục: từ lệnh Artian (cronjob).owner: root

Thông tin thêm về ghi nhật ký Laravel 5.6: https://laravel.com/docs/5.6/logging

Đây là config/logging.phptệp của tôi :

<?php

return [
    /*
    |--------------------------------------------------------------------------
    | Default Log Channel
    |--------------------------------------------------------------------------
    |
    | This option defines the default log channel that gets used when writing
    | messages to the logs. The name specified in this option should match
    | one of the channels defined in the "channels" configuration array.
    |
    */
    'default' => env('LOG_CHANNEL', 'stack'),
    /*
    |--------------------------------------------------------------------------
    | Log Channels
    |--------------------------------------------------------------------------
    |
    | Here you may configure the log channels for your application. Out of
    | the box, Laravel uses the Monolog PHP logging library. This gives
    | you a variety of powerful log handlers / formatters to utilize.
    |
    | Available Drivers: "single", "daily", "slack", "syslog",
    |                    "errorlog", "custom", "stack"
    |
    */
    'channels' => [
        'stack' => [
            'driver' => 'stack',
            'channels' => ['daily'],
        ],
        'single' => [
            'driver' => 'single',
            'path' => storage_path('logs/laravel.log'),
            'level' => 'debug',
        ],
        'daily' => [
            'driver' => 'daily',
            'path' => storage_path('logs/' . php_sapi_name() . '/laravel.log'),
            'level' => 'debug',
            'days' => 7,
        ],
        'slack' => [
            'driver' => 'slack',
            'url' => env('LOG_SLACK_WEBHOOK_URL'),
            'username' => 'Laravel Log',
            'level' => 'critical',
        ],
        'syslog' => [
            'driver' => 'syslog',
            'level' => 'debug',
        ],
        'errorlog' => [
            'driver' => 'errorlog',
            'level' => 'debug',
        ],
    ],
];

đẹp ... Giải pháp ur là sạch hơn .. im thử nghiệm nó bây giờ
Sina Miandashti

1
Như đã được chỉ ra trong một bình luận khác, nhật ký chỉ là một phần của câu chuyện. Có các dạng xem đã biên dịch, bộ nhớ đệm dữ liệu, mã nguồn được lưu trước trong bộ nhớ cache, bất kỳ cái nào trong số đó của tôi được tạo dưới dạng tệp cục bộ bởi web hoặc người dùng cli.
Jason

2
Điều này không hoạt động nếu bạn sử dụng bộ đệm ẩn cấu hình artisan config:cache, vì nó sẽ tạo bộ đệm cấu hình bằng cách sử dụng cli SAPI sẽ được sử dụng cho cả CLI và yêu cầu web.
leeb

1
Công trình này đối với tôi, cố gắng get_current_userkhông làm việc, nhưng php_sapi_namelàm việc (mặc dù nó có vẻ xấu hơn)
Richard Fu

Tôi nghĩ đây là cách nhanh nhất và tốt nhất. Sửa đổi cấu hình không sửa đổi cấu trúc cơ bản của Laravel, chỉ là cấu hình.
William Prigol Lopes

12

Đối với tôi, vấn đề này không chỉ là quyền đăng nhập ... Tôi gặp sự cố với bất kỳ thứ gì liên quan đến bootstrap / cache và các thư mục lưu trữ trong đó một người dùng sẽ tạo một tệp / thư mục và người kia sẽ không thể chỉnh sửa / xóa do tiêu chuẩn 644 và 755 quyền.

Các tình huống điển hình là:

  • Tệp bootstrap / cache / compile.php được tạo bởi người dùng apache nhưng không thể chỉnh sửa được bởi người dùng composer khi thực hiện lệnh cài đặt composer

  • Người dùng apache tạo bộ đệm ẩn không thể xóa bằng người dùng trình soạn nhạc

  • Các điều kiện cuộc đua nhật ký đáng sợ được mô tả ở trên.

Ước mơ là bất kể người dùng nào tạo tệp / thư mục, những người dùng khác cần truy cập đều có quyền giống tác giả gốc.

TL; DR?

Đây là cách nó được thực hiện.

Chúng ta cần tạo một nhóm người dùng dùng chung có tên laravel, nhóm này bao gồm tất cả những người dùng cần quyền truy cập vào thư mục lưu trữ và bootstrap / cache. Tiếp theo, chúng ta cần đảm bảo các tệp và thư mục mới được tạo có nhóm laravel và các quyền tương ứng là 664 và 775.

Thật dễ dàng thực hiện việc này đối với các tệp / thư mục hiện có, nhưng cần một chút ma thuật để điều chỉnh các quy tắc tạo tệp / thư mục mặc định ...

## create user group
sudo groupadd laravel

## add composer user to group
sudo gpasswd -a composer-user laravel

## add web server to group
sudo gpasswd -a apache laravel

## jump to laravel path
sudo cd /path/to/your/beautiful/laravel-application

## optional: temporary disable any daemons that may read/write files/folders
## For example Apache & Queues

## optional: if you've been playing around with permissions
## consider resetting all files and directories to the default
sudo find ./ -type d -exec chmod 755 {} \;
sudo find ./ -type f -exec chmod 644 {} \;

## give users part of the laravel group the standard RW and RWX
## permissions for the existing files and folders respectively
sudo chown -R :laravel ./storage
sudo chown -R :laravel ./bootstrap/cache
sudo find ./storage -type d -exec chmod 775 {} \;
sudo find ./bootstrap/cache -type d -exec chmod 775 {} \;
sudo find ./storage -type f -exec chmod 664 {} \;
sudo find ./bootstrap/cache -type f -exec chmod 664 {} \;


## give the newly created files/directories the group of the parent directory 
## e.g. the laravel group
sudo find ./bootstrap/cache -type d -exec chmod g+s {} \;
sudo find ./storage -type d -exec chmod g+s {} \;

## let newly created files/directories inherit the default owner 
## permissions up to maximum permission of rwx e.g. new files get 664, 
## folders get 775
sudo setfacl -R -d -m g::rwx ./storage
sudo setfacl -R -d -m g::rwx ./bootstrap/cache

## Reboot so group file permissions refresh (required on Debian and Centos)
sudo shutdown now -r

## optional: enable any daemons we disabled like Apache & Queues

Hoàn toàn cho mục đích gỡ lỗi, tôi thấy việc chia nhỏ các bản ghi cho cả người dùng cli / web + đều có lợi nên tôi đã sửa đổi một chút câu trả lời của Sam Wilson. Trường hợp sử dụng của tôi là hàng đợi chạy dưới người dùng của chính nó, vì vậy nó giúp phân biệt giữa người dùng trình soạn nhạc bằng cli (ví dụ: kiểm tra đơn vị) và daemon hàng đợi.

$app->configureMonologUsing(function(MonologLogger $monolog) {
     $processUser = posix_getpwuid(posix_geteuid());
     $processName= $processUser['name'];

     $filename = storage_path('logs/laravel-'.php_sapi_name().'-'.$processName.'.log');
     $handler = new MonologHandlerRotatingFileHandler($filename);
     $monolog->pushHandler($handler);
}); 

Điều này là rất tốt. configureMonologUsingTuy nhiên, mã của bạn vẫn cần thiết khi bạn đã chạy các setfacllệnh?
jeff-h

7

Laravel 5.1

Trong trường hợp của chúng tôi, chúng tôi muốn tạo tất cả các tệp nhật ký để mọi thứ trong deploynhóm đều có quyền đọc / ghi. Do đó, chúng tôi cần tạo tất cả các tệp mới có 0664quyền, trái ngược với 0644mặc định.

Chúng tôi cũng đã thêm một trình định dạng để thêm các dòng mới để dễ đọc hơn:

$app->configureMonologUsing(function(Monolog\Logger $monolog) {
    $filename = storage_path('/logs/laravel.log');
    $handler = new Monolog\Handler\RotatingFileHandler($filename, 0, \Monolog\Logger::DEBUG, true, 0664);
    $handler->setFormatter(new \Monolog\Formatter\LineFormatter(null, null, true, true));
    $monolog->pushHandler($handler);
});

Ngoài ra, có thể kết hợp điều này với câu trả lời được chấp nhận

$app->configureMonologUsing(function(Monolog\Logger $monolog) {
    $filename = storage_path('/logs/laravel-' . php_sapi_name() . '.log');
    $handler = new Monolog\Handler\RotatingFileHandler($filename, 0, \Monolog\Logger::DEBUG, true, 0664);
    $handler->setFormatter(new \Monolog\Formatter\LineFormatter(null, null, true, true));
    $monolog->pushHandler($handler);
});


5

Laravel 5.5

Thêm mã này vào bootstrap/app.php:

$app->configureMonologUsing(function (Monolog\Logger $monolog) {
    $filename = storage_path('logs/' . php_sapi_name() . '-' . posix_getpwuid(posix_geteuid())['name'] . '.log');
    $monolog->pushHandler($handler = new Monolog\Handler\RotatingFileHandler($filename, 30));
    $handler->setFilenameFormat('laravel-{date}-{filename}', 'Y-m-d');
    $formatter = new \Monolog\Formatter\LineFormatter(null, null, true, true);
    $formatter->includeStacktraces();
    $handler->setFormatter($formatter);
});
  • Nó sẽ lưu trữ các tệp như thế này: laravel-2018-01-27-cli-raph.logvà tệp nào laravel-2018-01-27-fpm-cgi-raph.logdễ đọc hơn.
  • Các dòng mới được giữ nguyên (theo hành vi Laravel mặc định)
  • Nó hoạt động với Laravel Log Viewer

Laravel 5.6

Bạn phải tạo một lớp cho trình ghi nhật ký của mình:

<?php

namespace App;

use Monolog\Logger as MonologLogger;

class Logger {
    public function __invoke(array $config)
    {
        $monolog = new MonologLogger('my-logger');
        $filename = storage_path('logs/' . php_sapi_name() . '-' . posix_getpwuid(posix_geteuid())['name'] . '.log');
        $monolog->pushHandler($handler = new \Monolog\Handler\RotatingFileHandler($filename, 30));
        $handler->setFilenameFormat('laravel-{date}-{filename}', 'Y-m-d');
        $formatter = new \Monolog\Formatter\LineFormatter(null, null, true, true);
        $formatter->includeStacktraces();
        $handler->setFormatter($formatter);
        return $monolog;
    }
}

Sau đó, bạn phải đăng ký nó trong config/logging.php:

'channels' => [
    'custom' => [
        'driver' => 'custom',
        'via' => App\Logging\CreateCustomLogger::class,
    ],
],

Hành vi tương tự như đối với 5.5:

  • Nó sẽ lưu trữ các tệp như thế này: laravel-2018-01-27-cli-raph.logvà tệp nào laravel-2018-01-27-fpm-cgi-raph.logdễ đọc hơn.
  • Các dòng mới được giữ nguyên (theo hành vi Laravel mặc định)
  • Nó hoạt động với Laravel Log Viewer

Câu trả lời tốt nhất! Kudos
Shahid Karimi

4

Thêm một cái gì đó như sau vào đầu app/start/artisan.phptệp của bạn (đây là với Laravel 4):

// If effectively root, touch the log file and make sure it belongs to www-data
if (posix_geteuid() === 0) {
    $file = storage_path() . '/logs/laravel.log';
    touch($file);
    chown($file, 'www-data');
    chgrp($file, 'www-data');
    chmod($file, 0664);
}

Điều chỉnh đường dẫn nếu tệp nhật ký hàng ngày mà bạn đề cập không phải là tệp nhật ký Laravel tiêu chuẩn. Bạn cũng có thể không muốn thay đổi nhóm hoặc đặt quyền như tôi đang làm ở đây. Ở trên đặt nhóm thành www-datavà đặt quyền ghi nhóm. Sau đó, tôi đã thêm người dùng thông thường của mình vào www-datanhóm để chạy các lệnh thủ công như người dùng thông thường của tôi vẫn có thể ghi vào nhật ký.

Một tinh chỉnh liên quan là đặt phần sau ở đầu app/start/global.phptệp của bạn :

umask(0002);

Nếu bạn làm điều này, chmoddòng trên sẽ trở thành tranh luận. Với umask được đặt thành này, bất kỳ tệp mới nào mà PHP (và do đó Laravel) tạo ra sẽ chỉ có quyền của chúng được che để người dùng "khác" không có quyền ghi. Điều này có nghĩa là các thư mục sẽ bắt đầu dưới dạng rwxrwxr-xvà các tệp dưới dạng rw-rw-r--. Vì vậy, nếu www-datađang chạy PHP, bất kỳ tệp nhật ký và bộ đệm nào mà nó tạo ra sẽ có thể được ghi theo mặc định bởi bất kỳ ai trong nhóm chính của người dùng đó www-data.


4

(Laravel 5.6) Gần đây tôi gặp phải vấn đề tương tự và tôi chỉ cần đặt một lệnh đã lên lịch để chạy /app/Console/Kernel.php.

$schedule->exec('chown -R www-data:www-data /var/www/**********/storage/logs')->everyMinute();

Tôi biết đó là một chút quá mức cần thiết, nhưng nó hoạt động như một sự quyến rũ và không có bất kỳ vấn đề nào kể từ đó.


Nó hoạt động? Đúng, nhưng có phải là phương pháp hay nhất không? Tôi nghĩ là không.
Pablo Papalardo

3

Laravel 5,4

\Log::getMonolog()->popHandler(); \Log::useDailyFiles(storage_path('/logs/laravel-').get_current_user().'.log');

thêm vào bootchức năng trongAppServiceProvider


1

Laravel 5,8

Laravel 5.8 cho phép bạn đặt tên đăng nhập config/logging.php.

Vì vậy, bằng cách sử dụng các câu trả lời và nhận xét trước đó, nếu bạn muốn đặt tên nhật ký bằng cả tên người dùng posix thực VÀ php_sapi_name()giá trị, bạn chỉ cần thay đổi bộ tên nhật ký. Sử dụng trình điều khiển hàng ngày cho phép xoay vòng nhật ký chạy trên mỗi kết hợp người dùng / api sẽ đảm bảo rằng nhật ký luôn được xoay bởi một tài khoản có thể sửa đổi nhật ký.

Tôi cũng đã thêm một kiểm tra cho các chức năng posix có thể không tồn tại trên môi trường cục bộ của bạn, trong trường hợp đó, tên nhật ký chỉ mặc định theo tiêu chuẩn.

Giả sử bạn đang sử dụng kênh nhật ký mặc định 'hàng ngày', bạn có thể sửa đổi khóa 'kênh' của mình như sau:

# config/logging.php
'channels' => [
    ...
    'daily' => [
        'driver' => 'daily',
        'path'   => storage_path(
            function_exists('posix_getpwuid') 
            && function_exists('posix_geteuid')
                ? 'logs/laravel'
                    . '-' . php_sapi_name()
                    . '-' . posix_getpwuid(posix_geteuid())['name'] 
                    . '.log'
                : 'logs/laravel.log'),
        'level'  => 'debug',
        'days'   => 15,
    ],
    ...

Điều này sẽ dẫn đến tên nhật ký phải là duy nhất cho mỗi tổ hợp, chẳng hạn như laravel-cli-sfscs-2019-05-15.loghoặc laravel-apache2handler-apache-2019-05-15.logtùy thuộc vào điểm truy cập của bạn.


0

Bạn có thể chỉ cần thay đổi quyền của tệp nhật ký trong lệnh thủ công của mình:

$path = storage_path('log/daily.log');
chown($path, get_current_user());

trong đó get_current_user () sẽ trả về người dùng của tập lệnh hiện tại.

Nói cách khác, daily.log sẽ luôn có www-datavới tư cách là chủ sở hữu của nó, ngay cả khi bạn khởi tạo tập lệnh với tư cách rootngười dùng.


0

Nếu bạn đang sử dụng Laravel Envoyer , đây là một bản sửa lỗi có thể sử dụng ACL trong Linux:

1. Đầu tiên, hãy chạy tập lệnh sau với rootquyền trên máy chủ:

Trong cả hai tập lệnh, bạn sẽ cần thay thế các biến như hướng dẫn bên dưới:

  • {{MASTER_PATH}} : Đường dẫn đến thư mục máy chủ ảo của bạn (ví dụ: thư mục> chứa (các) ứng dụng của bạn).
  • {{WEB_SERVER_USER}} : Người dùng mà máy chủ web của bạn sử dụng.
  • {{DEPLOYMENT_USER}} : Người dùng điều hành tập lệnh triển khai của bạn.
#!/bin/bash

DIRS="storage current/bootstrap/cache"
MASTER_PATH={{MASTER_PATH}}

if [ -d $MASTER_PATH ]; then 
    cd $MASTER_PATH
    for p in `ls $MASTER_PATH`; do 
        if [ -d $MASTER_PATH/$p ]; then     
        cd $MASTER_PATH/$p
            echo "Project: $p -> $MASTER_PATH/$p"
            for i in $DIRS; do 
                echo "- directory: $i" 
                if [ -d $i ]; then 
                    echo "-- checking ACL..."
                    HAS_ACL=`getfacl -p $i | grep "^user:{{WEB_SERVER_USER}}:.*w" | wc -l`
                    if [  $HAS_ACL -eq 0 ]; then 
                        echo "--- applying $i"
                        setfacl -L -R -m u:{{WEB_SERVER_USER}}:rwX -m u:{{DEPLOYMENT_USER}}:rwX $i
                        setfacl -dL -R -m u:{{WEB_SERVER_USER}}:rwX -m u:{{DEPLOYMENT_USER}}:rwX $i
                    else
                        echo "--- skipping $i"
                    fi
                fi
            done
        echo "--------------"
        fi
    done
else
    echo "No $MASTER_PATH - skipping overall"
fi

2. Thiết lập móc triển khai sau trên envoyer trong "Kích hoạt bản phát hành mới"> "Trước hành động này

PROJECT_DIRS="storage"
RELEASE_DIRS="bootstrap/cache"
 
cd {{ project }}
 
for i in $PROJECT_DIRS; do
  if [ -d $i ]; then
    HAS_ACL=`getfacl -p $i | grep "^user:{{WEB_SERVER_USER}}:.*w" | wc -l`
    if [  $HAS_ACL -eq 0 ]; then
      echo "ACL set for directory {{project}}/$i"
      setfacl -L -R -m u:{{WEB_SERVER_USER}}:rwX -m u:{{DEPLOYMENT_USER}}:rwX $i
      setfacl -dL -R -m u:{{WEB_SERVER_USER}}:rwX -m u:{{DEPLOYMENT_USER}}:rwX $i
    fi
  fi
done
 
cd {{ release }}
 
for i in $RELEASE_DIRS; do
  if [ -d $i ]; then
    HAS_ACL=`getfacl -p $i | grep "^user:{{WEB_SERVER_USER}}:.*w" | wc -l`
    if [  $HAS_ACL -eq 0 ]; then
      echo "ACL set for directory {{project}}/$i"
      setfacl -L -R -m u:{{WEB_SERVER_USER}}:rwX -m u:{{DEPLOYMENT_USER}}:rwX $i
      setfacl -dL -R -m u:{{WEB_SERVER_USER}}:rwX -m u:{{DEPLOYMENT_USER}}:rwX $i
    fi
  fi
done

3. Triển khai lại ứng dụng của bạn

Bây giờ triển khai lại ứng dụng của bạn và nó sẽ hoạt động trong tương lai.

Lưu ý: Tập lệnh được định nghĩa trong 1. sẽ được chạy mỗi khi bạn thêm một dự án mới vào máy.


0
cd /path/to/project
chown -R www-data:root .
chmod -R g+s .

-1

Cách tốt nhất mà tôi tìm thấy là đề xuất của fideloper, http://fideloper.com/laravel-log-file-name , bạn có thể đặt cấu hình nhật ký laravel mà không cần chạm vào Lớp nhật ký. Tôi nghĩ rằng có những tên khác nhau cho các chương trình Console và chương trình Http, là giải pháp tốt nhất.


-1

Giải pháp này chắc chắn sẽ hoạt động trên Laravel V5.1 - V6.x

Lý do cho lỗi này:

  • Nguyên nhân chủ yếu là do vấn đề về quyền
  • Không tìm thấy biến môi trường hoặc .envkhông tìm thấy tệp trên thư mục gốc của bạn
  • Vấn đề mở rộng PHP
  • Sự cố cơ sở dữ liệu

Sửa chữa:

  • Đặt các quyền chính xác:
    • Chạy các lệnh này (Ubuntu / Debian)
find /path/to/your/root/dir/ -type f -exec chmod 644 {} \;
find /path/to/your/root/dir/ -type d -exec chmod 755 {} \;

chown -R www-data:www-data /path/to/your/root/dir/

chgrp -R www-data storage bootstrap/cache
chmod -R ug+rwx storage bootstrap/cache
  • Nếu tệp .env không tồn tại, hãy tạo từng biến một touch .envvà dán các biến môi trường của bạn rồi chạy
   php artisan key:generate
   php artisan cache:clear
   php artisan config:clear
   composer dump-autoload
   php artisan migrate //only if not already migrated
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.