iT邦幫忙

2022 iThome 鐵人賽

DAY 24
0

在軟體的世界中,整個專案的執行成本,可能高達一半都是用在 Debug 上 (根據《 Code Complete 2 》),

而能幫助 Debug 最關鍵的工具,幾乎就是 Log 了,
透過在執行時留下的紀錄 (Log 檔),開發者能夠藉此觀察出 Bug 的線索,甚至如果寫得好,部分關鍵的資料一看就能鎖定出 Bug 的確切來源,

因此 Log 一直都是軟體系統中極為重要的一部分,讓我們接下來聊聊關於 Log。


Log 之於後端

Log 對於後端來說的影響力,又相比於軟體的其他領域更加關鍵,

這是由於後端的程式通常是執行在 Server、或是跑在背景裡,不像是前端可以看到畫面,光是看到畫面跟預期的差異,也許就可以看出一點線索 (但我畢竟不是前端開發者,歡迎提供你的經驗),
後端在執行的過程中,看不到摸不到,當出現 Bug 時,通常就只能看到一整個「壞掉的後端程式」,

壞掉的原因可能很多,例如資料庫失去連線、第三方 API 呼叫失敗、單純不小心寫錯了變數名稱、或複雜到演算法有邏輯錯誤,
呼叫後端的 API 時,這些狀況都可能出現,但每一種狀況的修改方式或修正需要的時間都不同,為了要確實地往根本原因 (Root cause) 追查,開發者需要先找到問題的線索,

這些線索就是來自於 Log,

讀者可能會疑惑,那 Log 跟資料庫有什麼不同?
資料庫的主要目的,是把資料用指定的結構儲存下來,讓程式可以查詢資料以提供服務,
而 Log 通常不是需求的一部分,沒有固定的格式,開發者根據經驗,讓程式持續把關鍵的資料記錄下來,後續才有猜測 Bug 線索的依據。


Docker Log

讓我們回到 Docker,Docker 將程式原本會印出來的內容寫到指定的位置,並提供了指令來查看,

$ docker log <container>

# or docker compose
$ docker compose logs [service-name]

當程式出現 Bug 時,我們會選取指定的 Container 來查看 Log 紀錄,

以我們 D17 的爬蟲程式為例,Log 大概是這樣:

Start to upload data of members for team 234
Uploaded, team: 234
Start to upload data of members for team 238
Uploaded, team: 238
Start to upload data of members for team 236
Start to upload data of members for team 236
Uploaded, team: 236
getMembersWithPostInfo, team: 233 TypeError: Cannot read properties of null (reading '1')
    at getLatestPostData (file:///app/src/ithelp-crawler.js:76:91)
    at runMicrotasks (<anonymous>)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
    at async getLatestPostData (file:///app/src/ithelp-crawler.js:94:10)
    at async file:///app/src/ithelp-crawler.js:106:27
    at async Promise.all (index 0)
    at async getMembersWithPostInfo (file:///app/src/ithelp-crawler.js:116:30)
    at async file:///app/src/ithelp-uploader.js:31:21
    at async Promise.all (index 0)
    at async crawlAndUploadTeamData (file:///app/src/ithelp-uploader.js:39:3)
Start to upload data of members for team 233
Uploaded, team: 233
...

最常在 Log 中紀錄的,有兩個部分,
一是錯誤訊息,用例外處理的 catch 區塊來把錯誤訊息印出來,
第二則是紀錄執行的結果,像是剛啟動後的過程紀錄、對第三方 API 的輸入輸出、對資料庫的連接等等,

在開發時,要紀錄什麼內容,幾乎是靠著開發者的經驗在判斷,
畢竟可能性太多了,但光是知道要寫下 Log,就已經會是 Debug 時的重要關鍵。


Log 在整個系統中的關鍵性,絕對值得多花時間來好好研究,

因此接下來的幾天,讓我們來談談關於在使用 Docker 時,要做 Log 的各種細節。


上一篇
D23 - 連接 Database
下一篇
D25 - Docker Compose 深不入淺不出
系列文
其實沒有那麼難 — Docker30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言