লারাভেল দৈনিক লগ ভুল অনুমতি নিয়ে তৈরি হয়েছে


112

আমার কাছে একটি স্ক্রিপ্ট রয়েছে যা আমি পিএইচপি আর্টিজান ( মূল ব্যবহারকারী সহ) ব্যবহার করে চালিয়েছি এবং কখনও কখনও এটি ডায়াল করে লগ ফাইলটি অ্যাপাচি www-ডেটা ব্যবহারকারীর তৈরি হওয়ার আগে তৈরি করে - যার অর্থ যখন সত্যিকারের ব্যবহারকারী আমার ওয়েব অ্যাপ্লিকেশন ব্যবহার করেন, তখন আমি পাই ফোল্ডারের অনুমতি ত্রুটি:

স্ট্রিমটি খুলতে ব্যর্থ: অনুমতি অস্বীকৃত

আমি অনুমতিগুলি ডাব্লু-ডেটাতে ফিরিয়ে দিই প্রতিবারই আনি তবে লগ ফাইলটি সর্বদা সঠিক অনুমতি নিয়ে তৈরি করে আমি এটি সমাধান করতে চাই।

আমি ক্রোন জব তৈরির বিষয়টি বিবেচনা করেছি যা ফাইলটি তৈরি করে বা এটির জন্য এটির স্পর্শ করে যাতে এটির সঠিক অনুমতিটি প্রতিদিন রয়েছে has তবে আমি আরও ভাল সমাধানের সন্ধান করছি যা অন্য স্ক্রিপ্টের উপর নির্ভর করে না।

আমরা পিএইচপি কারিগরকে অন্য স্ক্রিপ্টের মোড়কে বিবেচনা করে দেখেছি যে এটি সর্বদা www-ডেটা শংসাপত্রের সাথে চালিত হয় , তবে আমরা যে কিছু করতে চাই তা আসলে মূল প্রক্রিয়া যা অ্যাপাচি করার অনুমতি দেওয়া উচিত নয়।

আর কোন পরামর্শ?


প্রতিদিন মধ্যরাতে একটি নতুন লগ ফাইলে একটি cronচাকরী সেটআপ touchকরুন (অবশ্যই সঠিক ব্যবহারকারীর অধীনে)।
বেন হ্যারল্ড

@ বেনহরলড ধন্যবাদ, আমরা এটি বিবেচনা করেছি তবে আমি আরও স্ক্রিপ্টগুলি যুক্ত করব না।
নিআরআর

2
php artisanসেক্ষেত্রে আপনাকে লগ ফাইলটি তৈরি করতে চান এমন ব্যবহারকারী হিসাবে চালানো দরকার ।
বেন হ্যারল্ড

@ বেনহরোল্ড আবারও ধন্যবাদ, আমরা সেটিকেও বিবেচনা করেছি, যা সম্ভবত সবচেয়ে ভাল উপায়, তবে কেন এটিও আদর্শ নয় তা ব্যাখ্যা করার জন্য আমি প্রশ্নটি আপডেট করেছি।
NiRR

2
আমার জন্য যা কাজ করেছিল তা ছিল sudo crontab -u www-data -e
ক্রোনকে www-

উত্তর:


67

আসুন যা ধ্রুবক তা দিয়ে শুরু করি।

আপনার একটি php artisanআদেশ আছে, চালিত হবেroot

এটি অনুমান করা নিরাপদ যে এই কমান্ডটি প্রতিদিন সম্পাদিত হয়।

সমাধান নং 1:

ব্যবহারকারী যে ফাইলগুলি তৈরি করে তার মধ্যে এটির ডিফল্টরূপে এটি লেখার অনুমতি রয়েছে তবে আমরা ব্যবহারকারীর দ্বারা লগগুলি পৃথক করতে পারি:

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

যদি আপনার www-ডেটা ব্যবহারকারী একটি ত্রুটি লগ তৈরি করতে থাকে তবে এর ফলস্বরূপ:storage/logs/laravel-www-data-2015-4-27.log

আপনার যদি রুট ব্যবহারকারী ত্রুটি লগ তৈরি করতে, তবে এটাই হল স্থাপিত হবে: storage/logs/laravel-root-2015-4-27.log

সমাধান নম্বর 2:

আপনার পিএইচপি স্ক্রিপ্টে আপনার কারিগর কমান্ড দ্বারা ব্যবহৃত লগটি পরিবর্তন করুন।

আপনার run()কার্যক্রমে, শুরুতে এই লাইনটি যুক্ত করুন:

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

যদি আপনার শ্রেণীর নাম হয় ArtisanRunnerতবে আপনার লগ ফাইলটি হ'ল :

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

উপসংহার: সলিউশন নম্বর 1 টি দেওয়া ভাল, এটি ব্যবহারকারীর দ্বারা আপনার লগগুলি বর্ণিত করে এবং তাই কোনও ত্রুটি ঘটবে না।

সম্পাদনা: জেসন দ্বারা চিহ্নিত হিসাবে, get_current_user()স্ক্রিপ্টের মালিকের নাম ফেরত দেয়। সুতরাং, সমাধানের জন্য নম্বর 1 প্রয়োগ করার জন্য, chownআপনার কারিগর শ্রেণীর ফাইলগুলি প্রয়োজনীয় ব্যবহারকারীর নামতে ফাইল করুন।


12
দয়া করে নোট করুন যে get_current_user()বর্তমান পিএইচপি স্ক্রিপ্টের মালিককে (পিএইচপিএন অনুসারে) ফিরিয়ে দেন এবং বর্তমানে স্ক্রিপ্টটি চালাচ্ছেন এমন ব্যবহারকারীকে নয় । আমি php_sapi_name()পরিবর্তে ব্যবহার করি , যা পিএইচপি হ্যান্ডলারের নাম দেয় (উদাহরণস্বরূপ অ্যাপাচি বা ক্লাইট) যা বিভিন্ন ব্যবহারকারী হিসাবে চালিত হবে।
জেসন

1
আমি কীভাবে উভয় ব্যবহারকারীর নাম স্ক্রিপ্ট এবং php_sapi_name উভয় নাম ব্যবহার করে সিএলআই থেকে লারাভেল চালানো সম্ভব হিসাবে ব্যবহার করার পরামর্শ দিতে পারি যেমন কয়েকটি ডিবিএ আপনার সার্ভার অ্যাক্সেস করতে পারে বা আপনি লারাভেল সিআরনকে অ্যাপাচি হিসাবে চালাতে চাইতে পারেন can posix_getpwuid (posix_geteuid ()) ['নাম'] ব্যবহার করে এই স্ক্রিপ্টটি সম্পাদনকারী প্রক্রিয়াটির নাম পান; নীচে আমার সম্পূর্ণ পোস্ট দেখুন।
অ্যান্ড্রু

এটিকে সর্বশেষতম লারাভেল সংস্করণগুলির জন্য আপডেট করতে হবে: ভি 5 +
অ্যান্ড্রু

106

লারাভেল সংস্করণ 5.6.10 এবং এর পরে এবং ড্রাইভারের জন্য permissionকনফিগারেশন ( config/logging.php) এর একটি উপাদানটির জন্য সমর্থন রয়েছে :singledaily

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

বুটস্ট্র্যাপ স্ক্রিপ্টে মনোলোগের সাথে জগল করার দরকার নেই।

বিশেষত, সমর্থনটি https://github.com/laravel/framework/commit/4d31633dca9594c9121afbbaa0190210de28fed8 এ যুক্ত করা হয়েছিল ।


9
এটি সরকারী ডক মধ্যে থাকা উচিত!
25:38

3
এই জবাবটিতে অ্যাস্টিস্টোফগুলি অনুপস্থিত। এটি 'অনুমতি' => '0664' হওয়া উচিত। তাহলে এই উত্তরটি পুরোপুরি ঠিক আছে!
ফিল

2
@ ফিল নপ - এটি মনোলোগ্স স্ট্রিম হ্যান্ডলারের জন্য কেবল একটি মোড়ক যা অনুমতিগুলির জন্য কোনও int গ্রহণ করে। মনোলোজ php.net/manual/en/function.chmod.php মোড়েছে - নোট করুন যে একটি শীর্ষস্থানীয় 0 এটি অষ্টাল মান নিশ্চিত করার জন্য প্রয়োজনীয়
ক্রিস

7
'permission' => 0664আমার জন্য কাজ করে (উদ্ধৃতি ব্যতীত)
সাইক্লোন

2
@ ফ্রিডরিচ যদি আপনার লগ ফাইলটি ফাইলের মালিক হিসাবে 'রুট' দিয়ে তৈরি করা হয়, তবে সম্ভবত এটি আপনার ইঙ্গিত দেয় যে আপনার
ওয়েবসভারটি

62

লারাভেল 5.1-এর জন্য আমি নীচের দিকে bootstrap/app.php( ডক্সগুলিতে উল্লিখিত ) নীচের দিকে ব্যবহার করি :

/**
 * 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);
});

অবশ্যই প্রচুর হ্যান্ডলার রয়েছে যা আপনি পরিবর্তে অবশ্যই ব্যবহার করতে পারেন।


1
আমি এই উত্তরটি সত্যিই পছন্দ করি কারণ 1) এটি 5.1 এবং 2 এ আপডেট হয়েছে) লগের আচরণটি প্রসারিত করতে ডক্সে একটি পদ্ধতি ব্যবহার করে।
ডিলান পিয়ার্স

দুর্দান্ত, অতিরিক্ত ফরোয়ার্ড-ফ্ল্যাশ প্রয়োজন হয় না তবে এখনও কাজ করে। এটি পড়তে হবে ... $ ফাইলের নাম = স্টোরেজ_পথ ('লগ / লারাভেল -' ph php_sapi_name ()। '। লগ');
অ্যান্ড্রু

আমি কীভাবে উভয় ব্যবহারকারীর নাম স্ক্রিপ্ট এবং php_sapi_name উভয় ব্যবহারকারীর নাম সমন্বয় হিসাবে ব্যবহার করার পরামর্শ দিতে পারি কারণ অনেক ব্যবহারকারীর পক্ষে CLI থেকে লারাভেল চালানো সম্ভব যেমন কয়েকটি ডিবিএ আপনার সার্ভার অ্যাক্সেস করতে পারে বা আপনি লারাভেল সিআরনকে অ্যাপাচি হিসাবে চালাতে চাইতে পারেন You posix_getpwuid (posix_geteuid ()) ['নাম'] ব্যবহার করে এই স্ক্রিপ্টটি সম্পাদনকারী প্রক্রিয়াটির নাম পান; নীচে আমার সম্পূর্ণ পোস্ট দেখুন।
অ্যান্ড্রু

1
লারাভেল 5.6 এ এটি কীভাবে ব্যবহার করবেন? কারণ লারাভেল 5.6 এ একটি নতুন লগিং সিস্টেম রয়েছে।
হামেদ কামরাভা

26

এই জাতীয় উদ্দেশ্যে আপনার ফাইল এবং ডিরেক্টরিতে উন্নত এসিএল ব্যবহার করা উচিত। setfaclআপনার উত্তর এখানে হবে। আপনি যদি নির্দিষ্ট ডিরেক্টরিতে রুটের ফাইলগুলিতে লিখতে www-ডেটা ব্যবহারকারীর অনুমতি দিতে চান তবে আপনি এটি এটি করতে পারেন:

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

এটি ইস্যু করার পরে আপনি এই ফাইলগুলি কে তৈরি করেছেন তা বিবেচনা করেই সমস্ত ফাইলগুলিতে www-ডেটা ব্যবহারকারীর rwxজন্য অনুমতি নির্ধারণ করছেন । দয়া করে রেফারেন্সের জন্য এটি এবং এই প্রশ্নটি দেখুন । এছাড়াও, আপনি ডক্স পরীক্ষা করতে পারেন check/my/folder/setfacl

আমাকে জানতে দা্ও এটা সাহয্য করে কি - না।


3
নিম্নলিখিত কমান্ডটি আমার পক্ষে কাজ করেছে: তার setfacl -d -m g:www-data:rw /full/path/to/laravel/storage/logsপরে php artisan cache:clearএবং composer dump-autoload
সওনি

17

আমি এটি খুব সাধারণ উপায়ে কাজ করেছি:

আমি লারাভেল 5.6 তে একই সমস্যায় পড়েছি

ইন config/logging.phpআমি শুধু সঙ্গে দৈনন্দিন চ্যানেলের পথ মান আপডেট php_sapi_name()তাতে।

এটি বিভিন্ন পিএইচপি_স্যাপী_নামের জন্য পৃথক ডিউরেক্টরি তৈরি করে এবং লম্ব ফাইলকে তাদের পার্টিকুলার ডিরেক্টরিতে সময় স্ট্যাম্পের সাহায্যে রাখে।

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

তাই আমার জন্য,

  • লগ ফাইল fpm-fcgiডিরেক্টরি অধীনে তৈরি করা হয় : ওয়েবসাইট থেকে লগ,owner: www-data
  • লগ ফাইলগুলি cliডিরেক্টরিতে তৈরি হয় : কারিগর কমান্ড (ক্রোনজব) থেকে।owner: root

লারাভেল 5.6 লগিং সম্পর্কিত আরও তথ্য: https://laravel.com/docs/5.6/logging

আমার config/logging.phpফাইলটি এখানে :

<?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',
        ],
    ],
];

চমৎকার ... উর সমাধান ক্লিনার এসে গেছে .. তোমার দর্শন লগ করা এখন এটি পরীক্ষা
সিনা Miandashti

1
অন্য মন্তব্যে যেমন উল্লেখ করা হয়েছে, লগগুলি গল্পের একটি অংশ মাত্র। সংকলিত ভিউ, ডেটা ক্যাশে, প্রাক-ক্যাশেড সোর্স কোড রয়েছে, যার মধ্যে আমার ওয়েব বা ক্লাই ব্যবহারকারীর দ্বারা স্থানীয় ফাইল হিসাবে তৈরি করা যায়।
জেসন

2
আপনি যদি কনফিগার ব্যবহার করে ক্যাশে করেন তবে এটি কাজ করে না artisan config:cache, যেহেতু এটি ক্লিপ এসপিআই ব্যবহার করে একটি কনফিগার ক্যাশে তৈরি করবে যা সিএলআই এবং ওয়েব অনুরোধ উভয়ের জন্যই ব্যবহৃত হবে।
লেবেব 3'19

1
এটি আমার get_current_userপক্ষে কাজ করে , চেষ্টা করে না, তবে php_sapi_nameকাজ করে (যদিও এটি দেখতে খারাপ লাগে)
রিচার্ড ফু

আমি মনে করি এটি সবচেয়ে দ্রুত এবং সর্বোত্তম উপায়। কনফিগারেশনটি সংশোধন করা লারাভেলের প্রাথমিক কাঠামোটি পরিবর্তন করে না, কেবল কনফিগারেশন করে।
উইলিয়াম প্রিগল লোপস

12

আমার জন্য এই সমস্যাটি লগ অনুমতিগুলির চেয়ে অনেক বেশি ছিল ... আমার বুটস্ট্র্যাপ / ক্যাশে এবং স্টোরেজ ফোল্ডার সম্পর্কিত যে কোনও বিষয় ছিল যেখানে একজন ব্যবহারকারী কোনও ফাইল / ফোল্ডার তৈরি করতে পারবেন এবং অন্যজন স্ট্যান্ডার্ডের কারণে সম্পাদনা / মুছতে অক্ষম হবেন 644 এবং 755 অনুমতি।

সাধারণ পরিস্থিতিগুলি হ'ল:

  • বুপাস্ট্র্যাপ / ক্যাশে / সংকলিত.পিএফপি ফাইলটি অ্যাপাচি ব্যবহারকারী দ্বারা তৈরি করা হয়েছে তবে সুরকার ইনস্টল কমান্ড সম্পাদন করার সময় সুরকার ব্যবহারকারী দ্বারা অখাদ্য

  • অ্যাপাচি ব্যবহারকারী ক্যাশে তৈরি করছেন যা সুরকার ব্যবহারকারী ব্যবহার করে সাফ করতে পারবেন না

  • উপরে বর্ণিত ভয়ঙ্কর লগ রেসের শর্তাদি।

স্বপ্নটি হ'ল কোনও ব্যবহারকারী ফাইল / ফোল্ডার তৈরি করেন না কেন, যে অন্যান্য ব্যবহারকারীদের অ্যাক্সেস করা দরকার তাদের মূল লেখকের ঠিক একই অনুমতি থাকতে পারে।

টি এল; ডিআর?

এটি কিভাবে সম্পন্ন হয়েছে তা এখানে।

আমাদের লারাভেল নামে একটি ভাগ করা ব্যবহারকারী গ্রুপ তৈরি করতে হবে, এই গোষ্ঠীতে এমন সমস্ত ব্যবহারকারী রয়েছে যা স্টোরেজ এবং বুটস্ট্র্যাপ / ক্যাশে ডিরেক্টরিতে অ্যাক্সেসের প্রয়োজন। এরপরে আমাদের সুনির্দিষ্টভাবে তৈরি হওয়া ফাইল এবং ফোল্ডারগুলিতে যথাক্রমে ল্যারাভেল গ্রুপ এবং 664 এবং 775 অনুমতি রয়েছে তা নিশ্চিত করতে হবে।

বিদ্যমান ফাইল / ডিরেক্টরিগুলির জন্য এটি করা সহজ, তবে ডিফল্ট ফাইল / ফোল্ডারটি নিয়ম তৈরি করার জন্য একটি সামান্য যাদু প্রয়োজন ...

## 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

বিশুদ্ধরূপে ডিবাগিংয়ের উদ্দেশ্যে আমি দেখতে পেলাম লগগুলি ক্লিপ / ওয়েব + উভয় ক্ষেত্রেই বিভক্ত করা উপকারী ছিল তাই আমি স্যাম উইলসনের উত্তরটি কিছুটা সংশোধন করেছি। আমার ব্যবহারের কেসটি ছিল তার নিজস্ব ব্যবহারকারীর অধীনে রান করা তাই এটি ক্লাই (উদাহরণস্বরূপ ইউনিট পরীক্ষা) এবং ক্যু ডিমন ব্যবহার করে রচয়িতা ব্যবহারকারীর মধ্যে পার্থক্য করতে সহায়তা করে।

$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);
}); 

এটা খুব ভাল. configureMonologUsingএকবারে আপনি setfaclকমান্ডগুলি চালিয়ে গেলেও কি আপনার কোডটি প্রয়োজনীয় ?
jeff-h

7

লারাভেল 5.1

আমাদের ক্ষেত্রে আমরা সমস্ত লগ ফাইল তৈরি করতে চেয়েছিলাম যাতে deployগোষ্ঠীর প্রত্যেকটি অনুমতি / লেখার অনুমতি পড়তে পারে। সুতরাং, আমাদের 0664অনুমতি সহ সমস্ত নতুন ফাইল তৈরি করা দরকার , এর বিপরীতে0644 ডিফল্টের ।

আমরা আরও ভাল পঠনযোগ্যতার জন্য নতুন লাইন যুক্ত করতে একটি ফর্ম্যাটর যুক্ত করেছি:

$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);
});

এছাড়াও এটি গ্রহণযোগ্য উত্তরের সাথে একত্রিত করা সম্ভব

$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);
});

6

এই কাজটি করার একটি অ-লারাভেল উপায় হ'ল আপনার ক্রোনজবকে কেবল www-ডেটা হিসাবে চালিত করা।

যেমন /ubuntu/189189/how-to-run-crontab-as-userwww-data

/etc/crontab

*/5 * * * * www-data php /var/www/public/voto_m/artisan top >/dev/null 2>&1


5

লারাভেল 5.5

এই কোডটি এতে যুক্ত করুন 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);
});
  • এটি এর মতো ফাইলগুলি সংরক্ষণ করবে: laravel-2018-01-27-cli-raph.logএবংlaravel-2018-01-27-fpm-cgi-raph.log যা আরও পঠনযোগ্য।
  • নতুন লাইনগুলি সংরক্ষিত হয়েছে (ডিফল্ট লারাভেল আচরণ হিসাবে)
  • এটি লারাভেল লগ ভিউয়ারের সাথে কাজ করে

লারাভেল 5.6

আপনি একটি বর্গ তৈরি করতে আপনার এটির জন্য:

<?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;
    }
}

তারপরে, আপনাকে এটিতে নিবন্ধ করতে হবে config/logging.php:

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

5.5 হিসাবে একই আচরণ:

  • এটি এর মতো ফাইলগুলি সংরক্ষণ করবে: laravel-2018-01-27-cli-raph.logএবংlaravel-2018-01-27-fpm-cgi-raph.log যা আরও পঠনযোগ্য।
  • নতুন লাইনগুলি সংরক্ষিত হয়েছে (ডিফল্ট লারাভেল আচরণ হিসাবে)
  • এটি লারাভেল লগ ভিউয়ারের সাথে কাজ করে

সর্বোত্তম উত্তর! কুডোস
শহীদ করিমি

4

আপনার app/start/artisan.phpফাইলের শুরুতে নীচের মতো কিছু যুক্ত করুন (এটি লারাভেল 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);
}

আপনার উল্লেখ করা দৈনিক লগ ফাইলটি মান লারাভেল লগ ফাইল না হলে পথটি সামঞ্জস্য করুন। আপনি এখানে গ্রুপটি পরিবর্তন করতে বা অনুমতিগুলি সেট করতে চাইবেন না। উপরোক্ত দলগুলিতে সেট করে www-dataএবং গ্রুপ লেখার অনুমতি সেট করে। আমি তখন আমার নিয়মিত ব্যবহারকারীর সাথে যুক্ত করেছিwww-data গোষ্ঠীতে যাতে আমার নিয়মিত ব্যবহারকারী হিসাবে কারিগর কমান্ডগুলি চালানো এখনও লগতে লিখতে পারে।

সম্পর্কিত app/start/global.phpফাইলটি আপনার ফাইলের শুরুতে নীচে রাখা হয় :

umask(0002);

আপনি যদি এটি করেন তবে chmodউপরের লাইনটি মোটা হয়ে যাবে। উমাস্ক এটিতে সেট হয়ে গেলে, পিএইচপি (এবং তাই লারাভেল) তৈরি করা নতুন ফাইলগুলি কেবল তাদের অনুমতিগুলি মুখোশযুক্ত থাকবে যাতে "অন্যান্য" ব্যবহারকারীদের লেখার অনুমতি না থাকে। এর অর্থ ডিরেক্টরিগুলি rwxrwxr-xফাইল হিসাবে শুরু হবে rw-rw-r--। সুতরাং যদি www-dataপিএইচপি চলছে, এটি তৈরি করে এমন কোনও ক্যাশে এবং লগ ফাইলগুলি ব্যবহারকারীর মূল গোষ্ঠীর যে কোনও ব্যক্তির দ্বারা ডিফল্টরূপে রচনাযোগ্য www-data


4

(লারাভেল ৫..6) আমি সম্প্রতি একই সমস্যায় পড়েছি এবং আমি কেবল চালানোর জন্য একটি নির্ধারিত কমান্ড সেট করেছি /app/Console/Kernel.php

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

আমি জানি এটি ওভারকিলের সামান্য কিছু, তবে এটি একটি কবজির মতো কাজ করে এবং এর পরে কোনও সমস্যা হয়নি had


এটা কাজ করে? হ্যাঁ, তবে সেরা অনুশীলন? আমি মনে করি না.
পাবলো পাপালার্ডো

3

লারাভেল 5.4

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

bootইন ফাংশন যোগ করুনAppServiceProvider


1

লারাভেল 5.8

লারাভেল 5.8 আপনাকে লগের নামটি সেট করতে দেয় config/logging.php

সুতরাং পূর্ববর্তী উত্তর এবং মন্তব্যগুলি ব্যবহার করে, আপনি যদি নাম লিখতে চান তবে প্রকৃত পজিক্স ব্যবহারকারীর নাম এবং ব্যবহার করে লগইন করুন php_sapi_name() মান আপনাকে কেবল লগ নাম সেটটি পরিবর্তন করতে হবে। প্রতিদিনের ড্রাইভার ব্যবহারের ফলে ব্যবহারকারী / এপিআই সংমিশ্রণে চলতে পারে এমন লগ ঘোরানোর সুযোগ দেয় যা নিশ্চিত করে যে লগটি সর্বদা এমন অ্যাকাউন্ট দ্বারা আবর্তিত হয় যা লগগুলিকে সংশোধন করতে পারে।

আমি পোস্টিক ফাংশনগুলির জন্য একটি চেকও যুক্ত করেছি যা আপনার স্থানীয় পরিবেশে নাও থাকতে পারে, সেক্ষেত্রে লগ নামটি কেবলমাত্র মানকে ডিফল্ট করে।

ধরে নিই যে আপনি ডিফল্ট লগ চ্যানেল 'দৈনিক' ব্যবহার করছেন, আপনি নিজের 'চ্যানেল' কীটি এভাবে পরিবর্তন করতে পারেন:

# 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,
    ],
    ...

এই যে এই ধরনের প্রতিটি সমন্বয় করার অনন্য হওয়া উচিত একটি লগ নাম পরিণাম ডেকে আনবে laravel-cli-sfscs-2019-05-15.logবা laravel-apache2handler-apache-2019-05-15.logআপনার অ্যাক্সেস পয়েন্ট উপর নির্ভর করে।


0

আপনি কেবল আপনার কারিগর কমান্ডে লগ ফাইলের অনুমতি পরিবর্তন করতে পারেন:

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

যেখানে get_current_user () বর্তমান স্ক্রিপ্টটির ব্যবহারকারীকে ফিরিয়ে দেবে।

অন্য কথায়, daily.logসর্বদা www-dataএর মালিক হিসাবে থাকবে , এমনকি আপনি স্ক্রিপ্টটি rootব্যবহারকারী হিসাবে শুরু করলেও ।


0

আপনি যদি লারাভেল এনভায়ার ব্যবহার করছেন তবে লিনাক্সে এসিএল ব্যবহার করে এখানে একটি সম্ভাব্য ফিক্স দেওয়া আছে:

1. প্রথমে rootসার্ভারে অনুমতি সহ নিম্নলিখিত স্ক্রিপ্টটি চালান :

উভয় স্ক্রিপ্টে আপনাকে নীচের নির্দেশ অনুসারে ভেরিয়েবলগুলি প্রতিস্থাপন করতে হবে:

  • {ST MASTER_PATH}} : আপনার ভার্চুয়াল হোস্ট ডিরেক্টরিতে পাথ (যেমন ফোল্ডারটি> আপনার অ্যাপ্লিকেশন (গুলি) সমন্বিত)।
  • {E WEB_SERVER_USER}} : আপনার ওয়েব-সার্ভারটি ব্যবহারকারী।
  • {PL DEPLOYMENT_USER}} : আপনার ডিপ্লোয়মেন্ট স্ক্রিপ্ট ব্যবহারকারী দ্বারা চালিত।
#!/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. এই ক্রিয়াকলাপের আগে "নতুন প্রকাশের সক্রিয় করুন"> "এর অধীনে রাষ্ট্রদূতের উপরে নিম্নলিখিত স্থাপনার হুক সেট আপ করুন

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

৩. আপনার অ্যাপ্লিকেশনটি পুনরায় চালু করুন

এখন আপনার প্রশংসা পুনরায় প্রচার করুন এবং এটি এগিয়ে যাওয়ার কাজ করা উচিত।

দ্রষ্টব্য: 1 এ সংজ্ঞায়িত স্ক্রিপ্টটি প্রতিবার আপনি যখন মেশিনে কোনও নতুন প্রকল্প যুক্ত করবেন তখন চালানো উচিত।



-1

আমি যেভাবে খুঁজে পেয়েছি তার সেরা উপায় হ'ল ফিদেলোপারের পরামর্শ, http://fideloper.com/laravel-log-file-name , আপনি লগ ক্লাসটি স্পর্শ ছাড়াই লারাভেল লগ কনফিগারেশন সেট করতে পারেন। কনসোল প্রোগ্রাম এবং এইচটিটিপি প্রোগ্রামগুলির জন্য আলাদা আলাদা নাম রয়েছে, আমি মনে করি, এটিই সেরা সমাধান।


-1

এই সমাধানটি অবশ্যই লারাভেল ভি 5.1 - ভি 6.x এ কাজ করবে

এই ত্রুটির কারণগুলি:

  • মূলত অনুমতি সংক্রান্ত সমস্যার কারণে রয়েছে
  • পরিবেশের ভেরিয়েবলগুলি .envআপনার মূল ডিরেক্টরিতে পাওয়া যায় নি বা ফাইল খুঁজে পাওয়া যায় নি
  • পিএইচপি এক্সটেনশানগুলির সমস্যা
  • ডাটাবেস সমস্যা

ফিক্স:

  • সঠিক অনুমতি সেট করুন:
    • এই আদেশগুলি চালান (উবুন্টু / দেবিয়ান)
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
  • তাহলে .env ফাইল উপস্থিত না থাকলে, মাধ্যমে আপনি একটি তৈরি touch .envকরুন এবং আপনার এনভায়রনমেন্ট ভেরিয়েবল পেস্ট এবং তারপর চালানো
   php artisan key:generate
   php artisan cache:clear
   php artisan config:clear
   composer dump-autoload
   php artisan migrate //only if not already migrated
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.