[Day 24] 建立註冊的畫面及功能(八) - Laravel記錄Log

建立註冊的畫面及功能(八) - Laravel記錄Log

寫程式常常需要除錯,
除錯很常用的方法是透過寫Log,
在適當的地方寫Log,
往往能夠幫助我們找出錯誤,
進而修改錯誤.
Laravel本身當然也有提供Log來使用.

Laravel的日誌(Log)

Laravel使用 Monolog 庫為各種強大的日誌處理常式提供支援,
Laravel配置了多種日誌處理常式,
方便在一個或多個日誌檔或將錯誤資訊寫入系統日誌之間進行選擇.

Laravel的日誌檔的存儲目錄為storage/logs
使用Laravel的日誌要引用

use Illuminate\Support\Facades\Log;

Laravel的Log記錄器提供 RFC 5424 中定義的八種日誌級別:emergency、alert、critical、error、warning、notice、info 和 debug.

Log::emergency($message);
Log::alert($message);
Log::critical($message);
Log::error($message);
Log::warning($message);
Log::notice($message);
Log::info($message);
Log::debug($message);

Laravel的錯誤訊息設定

config/app.php設定檔的debug選項決定了是否向使用者顯示錯誤資訊,
預設情況下,
可以在.env檔中設定這個變數的值.

APP_DEBUG=true

對於我們在測試開發的時候,
APP_DEBUG應該要設置為true.
而在正式上線的時候,
應該要設定為false.
如果在正式上線設定為true,
有可能會將敏感的資訊暴露給使用者.

Laravel的日誌(Log)儲存

Laravel支援stack、single、daily、syslog和errorlog等多種日誌寫入模式,
新版的Laravel有更多種模式,
透過修改config/logging.php設定檔中的log選項來配置Laravel使用的存儲機制.
在.env中有個LOG_CHANNEL可以設定,
新版的Laravel預設是stack.

.env檔案

LOG_CHANNEL=stack

預設是把所有的Log都寫在同一個檔案中,
不過大部分會希望每天用不同的Log檔案,
才不會檔案太大、資料太多.
改成設定如下

LOG_CHANNEL=daily

我們看daily在config/logging.php裡面的預設設定值,
有需要的時候我們可以修改這些設定值.

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

最大日誌檔數

在使用daily日誌模式時,
Laravel預設保留14天份的日誌檔,
如果要調整保留檔的數量,
就在config/logging.php設定檔中修改days參數:

'days' => 30

日誌嚴重程度級別

使用Monolog時,
日誌消息可能具有不同程度的嚴重級別.
預設情況下,
Laravel 將存儲所有級別的日誌.
你也可以在生產環境中通過將level選項加到config/logging.php設定檔中來設定要記錄的嚴重程度最低的日誌級別.

設定之後,
Laravel就只會記錄大於或等於指定嚴重級別的所有級別的錯誤.
例如,預設的level被設置為warning,
那麼Laravel只會記錄warning、error、critical、alert和emergency級別的日誌資訊:

'level' => 'error',

Monolog的嚴重程度的級別,
從低到高為:debug、info、notice、warning、error、critical、alert、emergency.

實作記錄Log

我們將app/Http/Controllers/UserAuthController.php的signUpProcess修改如下

//處理註冊資料
public function signUpProcess()
{
    //接收輸入資料
    $input = request()->all();

    //驗證規則
    $rules = [
        //暱稱
        'name' => [
            'required',
            'max:50',
        ],
        //帳號(E-mail)
        'account' => [
            'required',
            'max:50',
            'email',
        ],
        //密碼
        'password' => [
            'required',
            'min:5',
        ],
        //密碼驗證
        'password_confirm' => [
            'required',
            'same:password',
            'min:5'
        ],
    ];

    //驗證資料
    $validator = Validator::make($input, $rules);

    if($validator->fails())
    {
        //資料驗證錯誤
        return redirect('/user/auth/sign-up')
                ->withErrors($validator)
                ->withInput();
    }

    $input['password'] = Hash::make($input['password']);

    //Log::notice(print_r($input, true));

    //啟用紀錄SQL語法
    DB::enableQueryLog();

    //新增使用者資料
    User::create($input);

    //取得目前使用過的SQL語法
    Log::notice(print_r(DB::getQueryLog(), true));

    var_dump($input);
    exit;
}

注意以下這一行

Log::notice(print_r($input, true));

當然檔案前面要

use Illuminate\Support\Facades\Log;

執行表單之後,
我們到storage\logs目錄下會看到新增了檔案
https://ithelp.ithome.com.tw/upload/images/20201001/20105694Qaoqm33bW5.png

打開來看會看到我們剛才存進去的資料
https://ithelp.ithome.com.tw/upload/images/20201001/201056949cukCz5rhW.png

參考資料:
Laravel 的錯誤和日誌記錄