分隔 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。