分隔 Laravel log file 以解決 Permission Deny 問題
Laravel 理當會將發生的例外錯誤(Exception)寫到 storage/logs/laravel-yyyy-mm-dd.log,但查詢該檔案,卻看不到應有的錯誤內容!
環境
Docker 安裝的內容,
- Ubuntu 18.04
- Nginx 1.14
- php7.3-fpm
權限問題 Permission Deny
1 | $ ll storage/logs/ |
系統有 crontab 定時處理事務,在處理的同時會以 Log::info() 輸出,所以產生的 log 檔案,其 owner 會是 root。
網站程式運行的 user 是 www-data,所以若發生程式的 Exception 就會因為 Permission Deny 而無法寫入,
解決方式
成功的解法 Success
在 bootstrap/app.php 檔案內加入以下程式碼,
1 |
|
以 php artisan command 執行或是 crontab 所產生的 log file,其 owner 都會是 root,
如果是網站運行時的 Exception 所建立的 log file,則 owner 會是 www-data,符合要的結果。 😄
1 | $ ll storage/logs/ |
無法得到預期效果的處理方式 failed
用 www-data 執行
以 www-data user 運行 php artisan command?
切換執行的 user 身份
1 | $ su www-data |
查看 www-data user
1 | $ cat /etc/passwd | grep www |
因 /usr/sbin/nologin 的關係,所以無法切換 user,
修改成
1 | $ vim /etc/passwd |
然後以 www-data 身份執行 php artisan 以產生 log file,會得到 owner 為 www-data 的 log file,
1 | $ su www-data |
BUT crontab 執行產生的 log file 仍然 root,Orz
修改 crontab
1 |
|
修改成
1 | * * * * * www-data /usr/bin/php /home/www/code/artisan schedule:run >> /dev/null 2>&1 |
然後執行
1 | $ sudo service cron reload |
結果 cron 無法運作,😳
可能需要這樣做(未驗證)
為 www-data 建立自己的 crontab 排程,可參考 [关于 Laravel 日志权限] 1 下方留言
1 | $ su www-data |
放棄測試
因環境是在 Docker 內,上述的步驟已經無法輕易以撰寫 shell script 達成要的結果,若需要人工介入修改,則不符合使用 Docker 無痛開發原則 XD。