iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 24
2
Modern Web

Laravel 6.0 初體驗!怎麼用最新的 laravel 架網站!系列 第 24

[Day 24] 紀錄網站的問題!談寫 Log

  • 分享至 

  • xImage
  •  

做好了各種機制之後,今天我們來聊一個簡單卻對開發很必要的功能:Log

為什麼要寫 Log

在網站開發的過程中,有時候上線的服務,會有很多奇怪的錯誤出現。

這時候,如果有之前的紀錄,比方說出錯前最後的用戶是哪位,對於偵測線上錯誤會很有幫助。

怎麼寫 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() 的時候,加入「如果是錯誤的用戶嘗試編輯,我們就寫紀錄」這個需求。

不過,我們同時希望,紀錄錯誤時可以同時加上用戶是哪位的資料。

所以,我們改寫 PostControlleredit() 看看

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 檔,學到怎麼紀錄時加上資料,還學到怎麼將紀錄分開寫在不同的檔案裡面!

希望今天讀者覺得有學到東西!我們明天見!


上一篇
[Day 23] 談用戶權限,怎麼能不談測試呢?
下一篇
[Day 25] 覺得自己的系統還不夠安全?用 laravel 快速的加解密!
系列文
Laravel 6.0 初體驗!怎麼用最新的 laravel 架網站!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言