Saya memiliki skrip yang saya jalankan menggunakan php artisan (dengan pengguna root ), dan terkadang hal itu menyebabkan file log harian dibuat sebelum pengguna www-data apache melakukannya - yang berarti bahwa ketika pengguna sebenarnya menggunakan aplikasi web saya, saya mendapatkan kesalahan izin folder:
Gagal membuka aliran: Izin ditolak
Saya mengubah izin kembali ke www-data setiap saat tetapi saya ingin menyelesaikannya dengan membuat file log selalu dibuat dengan izin yang benar.
Saya telah mempertimbangkan untuk membuat pekerjaan cron yang membuat file atau menyentuhnya untuk memastikannya memiliki izin yang tepat setiap hari, tetapi saya mencari solusi yang lebih baik yang tidak bergantung pada skrip lain.
Kami juga mempertimbangkan untuk membungkus pengrajin php dalam skrip lain untuk memastikan bahwa itu selalu dijalankan dengan kredensial data-www , tetapi sesuatu yang ingin kami lakukan sebenarnya adalah root prosedur yang seharusnya tidak diizinkan oleh apache.
Ada saran lagi?
cron
pekerjaan ketouch
file log baru pada tengah malam setiap hari (di bawah pengguna yang benar, tentu saja).php artisan
sebagai pengguna yang Anda inginkan untuk membuat file log.sudo crontab -u www-data -e
Jawaban:
Mari kita mulai dengan apa yang konstan.
Anda memiliki
php artisan
perintah, dijalankan olehroot
.Aman untuk mengasumsikan bahwa perintah ini dijalankan setiap hari.
Solusi No 1:
Mengingat bahwa pengguna yang membuat file adalah pengguna yang memiliki izin untuk menulis padanya secara default, kita dapat memisahkan log oleh pengguna seperti:
App/start/global.php
Jika Anda www-data pengguna adalah untuk membuat log kesalahan, itu akan menghasilkan:
storage/logs/laravel-www-data-2015-4-27.log
.Jika Anda akar pengguna adalah untuk membuat log kesalahan, itu akan menghasilkan:
storage/logs/laravel-root-2015-4-27.log
.Solusi No 2:
Ubah log yang digunakan oleh perintah artisan Anda, di skrip php Anda.
Dalam
run()
fungsi Anda , tambahkan baris ini di awal:Jika nama kelas Anda adalah
ArtisanRunner
, maka file log Anda adalah:storage/logs/laravel-ArtisanRunner-2015-4-27.log
.Kesimpulan: Solusi nomor 1 lebih baik, mengingat itu menggambarkan log Anda oleh pengguna, dan karenanya tidak ada kesalahan yang akan terjadi.
EDIT: Seperti yang ditunjukkan oleh jason,
get_current_user()
mengembalikan nama pemilik skrip. Karenanya, agar solusi no.1 dapat diterapkan,chown
file kelas artisan Anda ke nama pengguna yang diperlukan.sumber
get_current_user()
mengembalikan pemilik skrip PHP saat ini (menurut php.net) dan bukan pengguna yang sedang menjalankan skrip. Saya menggunakanphp_sapi_name()
sebagai gantinya, yang memberi nama php handler (apache atau cli, misalnya) yang cenderung dijalankan sebagai pengguna yang berbeda.Laravel versi 5.6.10 dan yang lebih baru memiliki dukungan untuk
permission
elemen dalam konfigurasi (config/logging.php
) untuksingle
dandaily
driver:Tidak perlu bermain-main dengan Monolog dalam skrip bootstrap.
Secara khusus, dukungan telah ditambahkan di https://github.com/laravel/framework/commit/4d31633dca9594c9121afbbaa0190210de28fed8 .
sumber
'permission' => 0664
bekerja untuk saya (tanpa kutipan)Untuk Laravel 5.1 saya menggunakan yang berikut ini di bagian bawah
bootstrap/app.php
(seperti yang disebutkan di dokumen ):Ada banyak Handler lain yang bisa Anda gunakan, tentu saja.
sumber
Untuk tujuan tersebut, Anda harus menggunakan ACL lanjutan pada file dan direktori Anda.
setfacl
akan menjadi jawaban Anda di sini. Jika Anda ingin memberikan izin pengguna www-data untuk menulis pada file root di direktori tertentu, Anda dapat melakukannya seperti ini:Setelah mengeluarkan ini, Anda mengatur izin
rwx
untuk www-data pengguna di semua file,/my/folder/
siapa pun yang membuatnya. Silakan, lihat ini dan pertanyaan ini untuk referensi. Selain itu, Anda dapat memeriksa dokumen untuksetfacl
.Beri tahu saya jika ini membantu.
sumber
setfacl -d -m g:www-data:rw /full/path/to/laravel/storage/logs
diikuti olehphp artisan cache:clear
dancomposer dump-autoload
.Saya memiliki ini bekerja dengan cara yang sangat sederhana:
Saya mengalami masalah yang sama di Laravel 5.6
Di
config/logging.php
saya baru saja memperbarui nilai jalur saluran harian denganphp_sapi_name()
di dalamnya.Ini membuat durasi terpisah untuk php_sapi_name yang berbeda dan meletakkan file log dengan cap waktu ke direktori perticular mereka.
Jadi bagi saya,
fpm-fcgi
direktori: Log dari situs web,owner: www-data
cli
direktori: dari perintah artisan (cronjob).owner: root
Info lebih lanjut tentang logging Laravel 5.6: https://laravel.com/docs/5.6/logging
Ini
config/logging.php
file saya :sumber
artisan config:cache
, karena ini akan membuat cache konfigurasi menggunakan cli SAPI yang akan digunakan untuk permintaan CLI dan web.get_current_user
tidak berhasil, tetapiphp_sapi_name
berhasil (meskipun tampaknya lebih buruk)Bagi saya masalah ini lebih dari sekadar izin log ... Saya memiliki masalah dengan apa pun yang terkait dengan bootstrap / cache dan folder penyimpanan di mana satu pengguna akan membuat file / folder dan yang lain tidak dapat mengedit / menghapus karena standar 644 dan 755 izin.
Skenario tipikal adalah:
File bootstrap / cache / compiled.php sedang dibuat oleh pengguna apache tetapi tidak dapat diedit oleh pengguna komposer saat melakukan perintah penginstalan komposer
Pengguna apache membuat cache yang tidak dapat dihapus menggunakan pengguna komposer
Impiannya adalah tidak peduli pengguna mana yang membuat file / folder, pengguna lain yang membutuhkan akses memiliki izin yang sama persis dengan pembuat aslinya.
TL; DR?
Begini caranya.
Kita perlu membuat grup pengguna bersama yang disebut laravel, grup tersebut terdiri dari semua pengguna yang membutuhkan akses ke direktori penyimpanan dan bootstrap / cache. Selanjutnya kita perlu memastikan file dan folder yang baru dibuat memiliki grup laravel dan izin 664 dan 775 masing-masing.
Sangat mudah melakukan ini untuk file / direktori yang ada, tetapi sedikit keajaiban diperlukan untuk mengubah aturan pembuatan file / folder default ...
Murni untuk tujuan debugging saya menemukan membagi log keluar menjadi pengguna cli / web + bermanfaat jadi saya memodifikasi jawaban Sam Wilson sedikit. Kasus penggunaan saya adalah antrian dijalankan di bawah pengguna itu sendiri sehingga membantu membedakan antara pengguna komposer menggunakan cli (misalnya tes unit) dan daemon antrian.
sumber
configureMonologUsing
kode Anda masih diperlukan, setelah Anda menjalankansetfacl
perintah?Laravel 5.1.0
Dalam kasus kami, kami ingin membuat semua file log sehingga semua yang ada di
deploy
grup memiliki izin baca / tulis. Oleh karena itu, kami perlu membuat semua file baru dengan0664
izin, bukan0644
default.Kami juga menambahkan pemformat untuk menambahkan baris baru agar lebih mudah dibaca:
Juga dimungkinkan untuk menggabungkan ini dengan jawaban yang diterima
sumber
Salah satu cara non-Laravel untuk membuat ini berfungsi adalah dengan menjalankan cronjob Anda sebagai www-data.
misalnya /ubuntu/189189/how-to-run-crontab-as-userwww-data
sumber
Laravel 5.5
Tambahkan kode ini ke
bootstrap/app.php
:laravel-2018-01-27-cli-raph.log
danlaravel-2018-01-27-fpm-cgi-raph.log
mana yang lebih mudah dibaca.Laravel 5.6
Anda harus membuat kelas untuk logger Anda:
Kemudian, Anda harus mendaftarkannya di
config/logging.php
:Perilaku yang sama seperti untuk 5.5:
laravel-2018-01-27-cli-raph.log
danlaravel-2018-01-27-fpm-cgi-raph.log
mana yang lebih mudah dibaca.sumber
Tambahkan sesuatu seperti berikut ini ke awal
app/start/artisan.php
file Anda (ini dengan Laravel 4):Sesuaikan jalur jika file log harian yang Anda sebutkan bukan file log Laravel standar. Anda juga mungkin tidak ingin mengubah grup atau mengatur izin seperti yang saya lakukan di sini. Di atas menyetel grup ke
www-data
dan menyetel izin menulis grup. Saya kemudian menambahkan pengguna biasa saya kewww-data
grup sehingga menjalankan perintah artisan sebagai pengguna biasa saya masih bisa menulis ke log.Perubahan terkait adalah menempatkan yang berikut ini di awal
app/start/global.php
file Anda :Jika Anda melakukan ini,
chmod
baris di atas menjadi diperdebatkan. Dengan umask disetel ke ini, file baru apa pun yang dibuat oleh PHP (dan oleh karena itu Laravel) akan memiliki izin yang hanya disembunyikan sehingga pengguna "lain" tidak akan memiliki izin menulis. Ini berarti direktori akan mulai sebagairwxrwxr-x
dan file sebagairw-rw-r--
. Jadi jikawww-data
menjalankan PHP, cache dan file log apa pun yang dibuatnya akan dapat ditulisi secara default oleh siapa pun di grup utama pengguna tersebut, yaituwww-data
.sumber
(Laravel 5.6) Baru-baru ini saya mengalami masalah yang sama dan saya cukup menyetel perintah terjadwal untuk dijalankan
/app/Console/Kernel.php
.$schedule->exec('chown -R www-data:www-data /var/www/**********/storage/logs')->everyMinute();
Saya tahu ini sedikit berlebihan, tetapi berfungsi seperti pesona dan tidak memiliki masalah sejak saat itu.
sumber
Laravel 5.4
\Log::getMonolog()->popHandler(); \Log::useDailyFiles(storage_path('/logs/laravel-').get_current_user().'.log');
tambahkan ke
boot
fungsi diAppServiceProvider
sumber
Laravel 5.8
Laravel 5.8 memungkinkan Anda mengatur nama log masuk
config/logging.php
.Jadi menggunakan jawaban dan komentar sebelumnya, jika Anda ingin memberi nama Anda log menggunakan nama pengguna posix yang sebenarnya DAN
php_sapi_name()
nilainya, Anda hanya perlu mengubah kumpulan nama log. Menggunakan driver harian memungkinkan rotasi log yang berjalan per kombinasi pengguna / api yang akan memastikan bahwa log selalu dirotasi oleh akun yang dapat mengubah log.Saya juga menambahkan pemeriksaan untuk fungsi posix yang mungkin tidak ada di lingkungan lokal Anda, dalam hal ini nama log hanya default ke standar.
Dengan asumsi Anda menggunakan saluran log default 'harian', Anda dapat mengubah kunci 'saluran' seperti ini:
Ini akan menghasilkan nama log yang harus unik untuk setiap kombinasi seperti
laravel-cli-sfscs-2019-05-15.log
ataularavel-apache2handler-apache-2019-05-15.log
bergantung pada titik akses Anda.sumber
Anda cukup mengubah izin file log di perintah artisan Anda:
di mana get_current_user () akan mengembalikan pengguna dari skrip saat ini.
Dengan kata lain,
daily.log
akan selalu memilikiwww-data
sebagai pemiliknya, bahkan jika Anda menginisialisasi skrip sebagairoot
pengguna.sumber
Jika Anda menggunakan Laravel Envoyer , berikut ini kemungkinan perbaikan menggunakan ACL di Linux:
1. Pertama, jalankan skrip berikut dengan
root
izin di server:2. Siapkan hook penerapan berikut pada utusan di bawah "Activate New Release"> "Before This Action
3. Terapkan ulang aplikasi Anda
Sekarang terapkan ulang aplikasi Anda, dan itu akan berhasil ke depannya.
sumber
sumber
Cara terbaik yang saya temukan adalah saran fideloper, http://fideloper.com/laravel-log-file-name , Anda dapat mengatur konfigurasi log laravel tanpa kelas Log sentuh. Memiliki nama yang berbeda untuk program Konsol dan program Http, menurut saya, adalah solusi terbaik.
sumber
Solusi ini pasti akan berfungsi pada Laravel V5.1 - V6.x
Alasan kesalahan ini:
.env
file tidak ditemukan di direktori root AndaMemperbaiki:
touch .env
dan tempel variabel lingkungan Anda dan kemudian jalankansumber