用過Laravel的小夥伴一開始安裝完框架後可能都遇到過daily 日誌文件寫入失敗的問題,接下來咱們就來詳細說下日誌文件寫入失敗的緣由以及對應的解決方案。php
在講這個問題以前可能須要簡單介紹下Linux系統下的文件的Ownership和Permission。linux
Ownershiplaravel
User是文件的全部者,默認狀況下,用戶建立了一個文件,該文件的全部者就是該用戶。web
一個用戶組能包含多個用戶,全部屬於這個組的用戶都有相同的權限來訪問文件。假設你有一個項目,不少用戶都須要訪問這個項目文件的權限,你不須要手動賦予這些用戶全部權限,你只須要把這些用戶加到一個組裏面,賦予這些組有訪問文件的權限,這樣一來就僅僅只有組裏面的成員能對文件進行讀寫操做。segmentfault
任何其餘的用戶都能訪問文件,所以,給Other用戶賦予權限,至關於全部用戶都擁有這個權限。服務器
Permission框架
在 UNIX/Linux 系統中每個文件和目錄都有3中權限,如下就是對三個全部者的討論。網站
<div style="text-align:center;font-size:12px">linux下文件信息的顯示截圖</div>spa
<div style="text-align:center;font-size:12px">linux下目錄的信息顯示截圖</div>debug
以上的截圖顯示了一個文件和文件夾的信息,咱們能夠看到:
r
表明可讀, w
表明可寫, x
表明可執行。-
,文件顯示 d
。rw-rw-r-—
中。第一組 rw-
表示文件的全部者對文件有可讀、可寫、不可執行的權限。第二組 rw-
表示文件所屬的組內用戶對該文件有可讀、可寫、不可執行的權限。第三組 r-—
表示其餘任何用戶對該文件有可讀、不可寫、不可執行的權限。rw-rw-r--
用二進制表示爲 664
,每一位若有權限則爲 1
,不然爲 0
,第一個三位 rw-
用二進制表示爲 110
轉化爲十進制就是 6
,後面兩組依次類推,最後獲得 664
。dior www-data
表示該文件的全部者是 dior
用戶,文件屬於 www-data
組。咱們知道不少應用系統中的日誌是寫文件的,且是以日期來命名文件的。因此第一次建立日誌的用戶就顯得尤其重要,若是文件建立的 Onwer
和 Group
不對,其餘的用戶觸發寫入日誌文件就會失敗。
接下來咱們討論下有多少種不一樣的用戶可能建立日誌文件:
Crontab
中執行的定時任務,跟建立 Crontab
的用戶有關,此時建立的文件 Owner
和 Group
值分別是該用戶以及默認的 Group
。queue work
,此時建立的日誌文件 Owner
和 Group
值分別是執行該進程的用戶以及所屬的默認 Group
。Owner
和 Group
都是 www-data
, www-data
用戶是web服務器默認的用戶。由以上的分析,咱們大概已經找到了解決問題的方法。
664
比較恰當,這就須要當前用戶的umask爲 0002
。Group
應該設置爲 www-data
。指定www-data用戶執行crontab:
sudo crontab -u www-data -e
Laravel中修改建立日誌文件的權限:
編輯 confog/logging.php
文件
添加 'permission' => 0664
'daily' => [ 'driver' => 'daily', 'path' => storage_path('logs/laravel.log'), 'level' => 'debug', 'days' => 14, 'permission' => 0664, ],
你有什麼更好的方法麼?歡迎留言!