Laravel दैनिक लॉग गलत अनुमतियों के साथ बनाया गया है


112

मेरे पास एक स्क्रिप्ट है जो मैं php कारीगर ( रूट उपयोगकर्ता के साथ ) का उपयोग करके चलाता हूं , और कभी-कभी यह एपेक www-data उपयोगकर्ता द्वारा किए जाने से पहले दैनिक लॉग फाइल बनाने का कारण बनता है - जिसका अर्थ है कि जब कोई वास्तविक उपयोगकर्ता मेरे वेब एप्लिकेशन का उपयोग करता है, तो मुझे मिलता है फ़ोल्डर अनुमति त्रुटि:

स्ट्रीम खोलने में विफल: अनुमति से इनकार किया गया

मैं अनुमतियों को www-data में वापस बदल देता हूं, लेकिन मैं हमेशा सही अनुमतियों के साथ बनाई गई लॉग फ़ाइल होने से इसे हल करना चाहता हूं।

मैंने एक क्रॉन जॉब बनाने पर विचार किया है जो फ़ाइल बनाता है या यह सुनिश्चित करने के लिए इसे छूता है कि इसकी हर रोज सही अनुमति है, लेकिन मैं एक बेहतर समाधान की तलाश कर रहा हूं जो किसी अन्य स्क्रिप्ट पर निर्भर न हो।

हमने यह भी सुनिश्चित करने के लिए एक और स्क्रिप्ट में php कारीगर लपेटने पर विचार किया है कि यह हमेशा www-data क्रेडेंशियल्स के साथ चलाया जाता है , लेकिन कुछ दिन जो हम करना चाहते हैं वह वास्तव में रूट प्रक्रियाएं हैं जो अपाचे को करने की अनुमति नहीं दी जानी चाहिए।

कोई और सुझाव?


हर दिन आधी रात cronको touchएक नई लॉग फ़ाइल में (सही उपयोगकर्ता के तहत, निश्चित रूप से) नौकरी सेट करें।
बेन हेरोल्ड

@BenHarold धन्यवाद, हमने माना है कि लेकिन मैं अधिक स्क्रिप्ट शामिल नहीं करूंगा।
NiRR

2
उस स्थिति में आपको php artisanउस उपयोगकर्ता के रूप में चलना होगा जिसे आप लॉग फ़ाइल बनाना चाहते हैं।
बेन हेरोल्ड

@BenHarold फिर से धन्यवाद, हमने माना है कि जैसे कि, शायद जाने का सबसे अच्छा तरीका है, लेकिन मैंने इस सवाल को अपडेट किया है कि यह आदर्श क्यों नहीं है।
NiRR

2
मेरे लिए काम करने वाले को www-data उपयोगकर्ता के रूप में क्रॉन को निष्पादित करना थाsudo crontab -u www-data -e
Nil Llisterri

जवाबों:


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:

अपने कारीगर कमांड द्वारा उपयोग की गई लॉग को अपनी php स्क्रिप्ट में बदलें।

अपने 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 बेहतर है, यह देखते हुए कि यह उपयोगकर्ता द्वारा आपके लॉग को डिलीट करता है, और इसलिए कोई त्रुटि नहीं होगी।

EDIT: जैसा कि जेसन ने बताया है, get_current_user()स्क्रिप्ट के मालिक का नाम देता है। इसलिए, समाधान नंबर 1 को लागू करने के लिए, chownअपने कारीगर वर्ग की फ़ाइलों को आवश्यक उपयोगकर्ता नाम पर रखें।


12
कृपया ध्यान दें कि get_current_user()वर्तमान PHP स्क्रिप्ट (php.net के अनुसार) के मालिक को लौटाता है, न कि उस उपयोगकर्ता को जो वर्तमान में स्क्रिप्ट चला रहा है। मैं php_sapi_name()इसके बजाय उपयोग करता हूं , जो php हैंडलर (अपाचे या cli, उदाहरण के लिए) का नाम देता है, जो विभिन्न उपयोगकर्ताओं के लिए चलाया जाएगा।
जेसन

1
क्या मैं संयोजन में स्क्रिप्ट और php_sapi_name को निष्पादित करने वाले दोनों उपयोगकर्ताओं के नाम का उपयोग करने का सुझाव दे सकता हूं क्योंकि कई उपयोगकर्ताओं के लिए CLI से Laravel को निष्पादित करना संभव है। उदाहरण के लिए, कुछ DBAs आपके सर्वर तक पहुँच प्राप्त करते हैं या आप चाहते हैं कि Lachevel CRON एपाचे के रूप में चले। इस लिपि को निष्पादित करने वाले प्रक्रिया का नाम प्राप्त करें, जिसमें posix_getpwuid (posix_geteuid ()) ['name'] का उपयोग किया गया है; नीचे मेरी पूरी पोस्ट देखें।
एंड्रयू

इसे नवीनतम लारवेल संस्करणों के लिए अद्यतन करने की आवश्यकता है: v5 +
एंड्रयू

106

लारवेल संस्करण 5.6.10 और बाद में और ड्राइवर के लिए permissionकॉन्फ़िगरेशन में एक तत्व के लिए समर्थन है :config/logging.phpsingledaily

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

बूटस्ट्रैप स्क्रिप्ट में मोनोलॉग के साथ मज़ाक करने की ज़रूरत नहीं है।

विशेष रूप से, https://github.com/laravel/framework/commit/4d31633dca9594c9121afbbaa0190210de28fed8 में समर्थन जोड़ा गया था ।


9
यह आधिकारिक डॉक्टर में होना चाहिए!
ओडूपोंट

3
इस उत्तर में अपोस्ट्रोफ़्स गायब हैं। यह 'अनुमति' => '0664' होना चाहिए। फिर यह जवाब पूरी तरह से ठीक है!
फिल

2
@Phil Nope - यह मोनोलॉग्स स्ट्रीम हैंडलर के लिए सिर्फ एक आवरण है जो अनुमतियों के लिए एक int स्वीकार करता है। Monolog wraps php.net/manual/en/function.chmod.php - ध्यान दें कि एक प्रमुख 0 बनाने के लिए आवश्यक है यकीन है कि यह एक अष्टाधारी मूल्य है
क्रिस

7
'permission' => 0664मेरे लिए काम करता है (उद्धरण के बिना)
साइक्लोन

2
@Friedrich अगर आपकी लॉग फ़ाइल को फ़ाइल के स्वामी के रूप में 'रूट' के साथ बनाया जा रहा है, तो इस बात की संभावना है कि आपके वेबसर्वर के सेटअप के संदर्भ में आपके पास बड़े मुद्दे हैं
kjones 18

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) लॉग व्यवहार को विस्तारित करने के लिए डॉक्स में एक विधि का उपयोग करता है।
डायलन पियर्स

बहुत बढ़िया, अतिरिक्त फ़ॉरवर्ड-फ्लैश की ज़रूरत नहीं है लेकिन फिर भी काम करता है। इसे पढ़ना चाहिए ... $ फ़ाइल नाम = storage_path ('लॉग / लार्वा -'। Php_sapi_name ()। '। Log'))।
एंड्रयू

क्या मैं संयोजन में स्क्रिप्ट और php_sapi_name को निष्पादित करने वाले दोनों उपयोगकर्ताओं के नाम का उपयोग करने का सुझाव दे सकता हूं क्योंकि कई उपयोगकर्ताओं के लिए CLI से Laravel को निष्पादित करना संभव है। उदाहरण के लिए, कुछ DBAs आपके सर्वर तक पहुँच प्राप्त करते हैं या आप चाहते हैं कि Lachevel CRON एपाचे के रूप में चले। इस लिपि को निष्पादित करने वाले प्रक्रिया का नाम प्राप्त करें, जिसमें posix_getpwuid (posix_geteuid ()) ['name'] का उपयोग किया गया है; नीचे मेरी पूरी पोस्ट देखें।
एंड्रयू

1
लारवेल 5.6 में इसका उपयोग कैसे करें? क्योंकि Laravel 5.6 में एक नया लॉगिंग सिस्टम है।
कामरावा

26

ऐसे उद्देश्यों के लिए आपको अपनी फ़ाइलों और निर्देशिकाओं पर उन्नत एसीएल का उपयोग करना चाहिए। setfaclयहाँ आपका जवाब होगा। यदि आप विशिष्ट निर्देशिका में रूट की फाइलों पर लिखने के लिए www-data उपयोगकर्ता अनुमति देना चाहते हैं , तो आप इसे इस तरह कर सकते हैं:

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

इसे जारी करने के बाद आप उन सभी फाइलों पर www-data उपयोगकर्ता के rwxलिए अनुमतियाँ सेट कर रहे हैं, जो किसी भी मामले में नहीं बने हैं। कृपया, संदर्भ के लिए यह और यह प्रश्न देखें । इसके अलावा, आप डॉक्स की जांच कर सकते हैं ।/my/folder/setfacl

मुझे बताएं क्या इससे मदद मिलती है।


3
निम्नलिखित कमांड ने मेरे लिए काम किया: setfacl -d -m g:www-data:rw /full/path/to/laravel/storage/logsउसके बाद php artisan cache:clearऔर composer dump-autoload
सवा 13

17

मैंने यह बहुत सरल तरीके से काम किया था:

मैं लारवेल 5.6 पर एक ही समस्या में भाग गया

इसमें config/logging.phpमैंने सिर्फ दैनिक चैनल के पथ मान को अपडेट php_sapi_name()किया है।

यह अलग php_sapi_name के लिए अलग durectory बनाता है और लॉग फ़ाइल को उनकी पेरिफ़िकल डायरेक्टरी में समय की मोहर के साथ डालता है।

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

अच्छा ... उर का घोल क्लीनर है .. इसे अभी परीक्षण कर रहे हैं
सीना मियांदस्ती ६'१:52

1
जैसा कि एक अन्य टिप्पणी में कहा गया है, लॉग केवल कहानी का एक हिस्सा है। संकलित विचार, डेटा कैश, पूर्व-कैश्ड स्रोत कोड हैं, जिनमें से किसी को भी वेब या क्ली उपयोगकर्ता द्वारा स्थानीय फ़ाइलों के रूप में बनाया जा सकता है।
जेसन

2
यदि आप कॉन्फिग कैश का उपयोग कर रहे हैं तो यह काम नहीं करता है artisan config:cache, क्योंकि यह क्ली एसएपीआई का उपयोग करके एक कॉन्फिग कैश तैयार करेगा जो कि सीएलआई और वेब अनुरोध दोनों के लिए उपयोग किया जाएगा।
लीब

1
यह मेरे लिए काम करता है, कोशिश की, get_current_userकाम नहीं करता है, लेकिन php_sapi_nameकाम करते हैं (हालांकि यह बदसूरत लगता है)
रिचर्ड फू

मुझे लगता है कि यह सबसे तेज और सबसे अच्छा तरीका है। कॉन्फ़िगरेशन को संशोधित करना लारवेल की बुनियादी संरचना को संशोधित नहीं करता है, बस कॉन्फ़िगरेशन।
विलियम प्रिगोल लोप्स 14

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कमांड चलाने के बाद क्या आपका कोड अभी भी आवश्यक है ?
जेफ-एच

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-data के रूप में निष्पादित करना है।

उदा। /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फ़ाइल की शुरुआत के लिए निम्न जैसा कुछ जोड़ें (यह 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);
}

यदि आपके द्वारा उल्लिखित दैनिक लॉग फ़ाइल मानक Laravel लॉग फ़ाइल नहीं है, तो पथ समायोजित करें। आप समूह को बदलना या अनुमतियाँ सेट नहीं करना चाहते हैं जैसा कि मैं यहाँ कर रहा हूँ। उपरोक्त समूह समूह को www-dataसेट करता है और समूह लेखन अनुमतियाँ सेट करता है। फिर मैंने अपने नियमित उपयोगकर्ता को www-dataसमूह में जोड़ा है ताकि मेरे नियमित उपयोगकर्ता के रूप में चल रहे कारीगर कमांड लॉग में लिख सकें।

संबंधित app/start/global.phpफ़ाइल को आपकी फ़ाइल की शुरुआत में रखना है :

umask(0002);

यदि आप ऐसा करते हैं तो chmodऊपर की लाइन मूट हो जाती है। इसके लिए सेट किए गए umask के साथ, कोई भी नई फ़ाइल PHP (और इसलिए लारवेल) बनाती है उनकी अनुमति केवल इसलिए होगी कि "अन्य" उपयोगकर्ताओं के पास लिखने की अनुमति नहीं होगी। इसका मतलब है कि निर्देशिका के रूप में rwxrwxr-xऔर फ़ाइलों के रूप में शुरू हो जाएगा rw-rw-r--। इसलिए यदि www-dataPHP चल रहा है, तो कोई भी कैश और लॉग फाइल जो बनाता है, वह उस उपयोगकर्ता के मुख्य समूह में किसी के द्वारा डिफ़ॉल्ट रूप से लेखन योग्य होगा, जो कि है www-data


4

(लारवेल 5.6) मैं हाल ही में एक ही समस्या में भाग गया और मैंने बस चलाने के लिए एक निर्धारित कमांड सेट किया /app/Console/Kernel.php

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

मुझे पता है कि यह थोड़ा अधिक है, लेकिन यह एक आकर्षण की तरह काम करता है और इसके बाद से कोई समस्या नहीं है।


यह काम करता हैं ? हां, लेकिन क्या सबसे अच्छा अभ्यास है? मुझे नहीं लगता।
पाब्लो पापालार्डो

3

लारवेल 5.4

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

bootमें कार्य करने के लिए जोड़ेंAppServiceProvider


1

लारवेल 5.8

Laravel 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

यदि आप Laravel Envoyer का उपयोग कर रहे हैं , तो यहां लिनक्स में ACL का उपयोग करके एक संभावित फिक्स है:

1. सबसे पहले, rootसर्वर पर अनुमतियों के साथ निम्न स्क्रिप्ट चलाएँ :

दोनों स्क्रिप्ट में आपको नीचे दिए गए निर्देशों के अनुसार चर को बदलना होगा:

  • {{MASTER_PATH}} : आपके वर्चुअल होस्ट निर्देशिका (उदाहरण के लिए फ़ोल्डर> जिसमें आपका एप्लिकेशन है) का पथ।
  • {{WEB_SERVER_USER}} : उपयोगकर्ता आपके वेब-सर्वर का उपयोग करता है।
  • {{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

3. अपने आवेदन को कम करें

अब अपने मूल्यांकन को फिर से परिभाषित करें, और यह आगे जाकर काम करना चाहिए।

नोट: स्क्रिप्ट में परिभाषित 1. हर बार जब आप मशीन के लिए एक नई परियोजना को जोड़ने चलाने की जानी चाहिए।



-1

सबसे अच्छा तरीका मैंने पाया है कि फिदेल्पर सुझाव देते हैं, http://fideloper.com/laravel-log-file-name , आप लारवेल लॉग कॉन्फ़िगरेशन को स्पर्श लॉग वर्ग के बिना सेट कर सकते हैं। कंसोल प्रोग्राम और Http प्रोग्राम के लिए अलग-अलग नाम हैं, मुझे लगता है, सबसे अच्छा समाधान है।


-1

यह समाधान निश्चित रूप से Laravel V5.1 - V6.x पर काम करेगा

इस त्रुटि के कारण:

  • अनुमति के मुद्दों के कारण मुख्य रूप से होते हैं
  • पर्यावरण चर नहीं मिला या .envआपकी रूट निर्देशिका में फ़ाइल नहीं मिली
  • PHP एक्सटेंशन समस्या
  • डेटाबेस की समस्या

ठीक कर:

  • सही अनुमतियाँ सेट करें:
    • इन आदेशों को चलाएं (उबंटू / डेबियन)
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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.