做好了各種機制之後,今天我們來聊一個簡單卻對開發很必要的功能:Log
在網站開發的過程中,有時候上線的服務,會有很多奇怪的錯誤出現。
這時候,如果有之前的紀錄,比方說出錯前最後的用戶是哪位,對於偵測線上錯誤會很有幫助。
在 Laravel 裡面,紀錄 Log 非常的簡單。我們改寫一下 test
來測試看看
Route::get('/test', function(){
Illuminate\Support\Facades\Log::info('觸發 Test');
});
接著,連線到 http://127.0.0.1/test 之後,我們到 storage/logs
裡面,打開 laravel-2019-09-26.log
,裡面應該就會有
[2019-09-26 xx:xx:xx] local.INFO: 觸發 Test
這一行。
好了!基本的 Log 就是這麼簡單!
edit
時加入 Log現在,我們嘗試在 edit()
的時候,加入「如果是錯誤的用戶嘗試編輯,我們就寫紀錄」這個需求。
不過,我們同時希望,紀錄錯誤時可以同時加上用戶是哪位的資料。
所以,我們改寫 PostController
的 edit()
看看
public function edit(Post $post)
{
$user = Auth::user();
if(is_null($user) || $user->cant('update', $post)){
Log::info('錯誤用戶嘗試編輯', ['user' => $user]);
return redirect(route('posts.index'));
}
return view('posts.edit', ['post' => $post]);
}
然後,我們用未登入的狀態下,嘗試存取 http://127.0.0.1/posts/1/edit ,之後到 storage/logs
找紀錄。
如果成功的話,應該會有以下紀錄
[2019-09-26 xx:xx:xx] local.INFO: 錯誤用戶嘗試編輯 {"user":null}
如果是錯誤的用戶登入,那麼應該會有類似這樣的紀錄
[2019-09-26 15:35:58] local.INFO: 錯誤用戶嘗試編輯 {"user":{"App\\User":{"id":1,"name":"aaa","email":"aaa@aaa.aaa","email_verified_at":null,"created_at":"2019-09-26 15:35:48","updated_at":"2019-09-26 15:35:48"}}}
這樣,我們不僅紀錄哪個時間點,有誰進行錯誤的行為,我們還同時紀錄的操作錯誤的用戶。這樣修正錯誤就變得更加容易囉!
隨著網站功能越來越多,紀錄一多起來,有時候要找到問題就變得很不容易。
有沒有什麼辦法,可以將不同功能所產生的紀錄,寫到不同資料夾的檔案內呢?
有的!我們現在就試著把所有 Post
相關的紀錄,寫到 storage/logs/posts
裡面
首先,我們到 config/logging.php
裡面,找到 channels
陣列。然後加上
'posts' => [
'driver' => 'daily',
'path' => storage_path('logs/posts/laravel.log'),
],
這裏,'driver' => 'daily',
代表每天會寫在不一樣的 Log 檔案裡面,'path' => storage_path('logs/posts/laravel.log'),
則代表會將檔案寫在 storage/logs/posts/laravel-日期.log
裡面。
寫好之後,我們改寫一下前面的程式,讓這裡面的紀錄改寫到 posts
這個頻道裡面
public function edit(Post $post)
{
$user = Auth::user();
if(is_null($user) || $user->cant('update', $post)){
Log::channel('posts')->info('錯誤用戶嘗試編輯', ['user' => $user]);
return redirect(route('posts.index'));
}
return view('posts.edit', ['post' => $post]);
}
設置成功之後,我們再次觸發這個事件看看,就會發現紀錄被寫到 storage/logs/posts/
裡面囉!
今天學的東西比較單純,不過我們還是小小總結一下今天學到的東西
今天我們學到怎麼紀錄 Log 檔,學到怎麼紀錄時加上資料,還學到怎麼將紀錄分開寫在不同的檔案裡面!
希望今天讀者覺得有學到東西!我們明天見!