當你在建立 Function App 時也同時啟用了 Application Insights 的話,預設會啟用內建的記錄機制(built-in logging),並且會把記錄儲存在 Azure Storage 儲存體帳戶的 Table 中。我們有個 Azure Function (v1) 應用程式,至今穩定運作了 4 年,但最近發現就算沒有什麼流量,儲存體的費用也很高。因為我們的網站最近已經沒有什麼流量,怎麼還會花這麼多錢呢?我分析了一下,發現光是 Table Storage 就佔用儲存體有 113 GiB 之多這才驚覺,原來是 Function App 搞的鬼,他們把所有監控的數據都自動儲存到指定的 Azure Storage 儲存體帳戶之中了!今天我就來說明如何有效率的刪除這些過時的紀錄,避免不必要的資源耗用。
Function App 的執行記錄都存在哪裡?
每個 Function App 都會有個相對應的 Storage account (儲存體帳戶),而在應用程式設定中,預設有個 AzureWebJobsDashboard
參數,指向儲存體帳戶的連接字串。然而,這個參數最主要的目的,就是寫入 Function App 的所有執行紀錄,但內容沒啥營養,就是時間而已:
但每個 Function 每次執行都會記錄一筆,所以很容易累積到非常多。更重要的是,他不會自動清除,只會自動累積,並且一個月就會建立一個 Table 起來,其命名規則為 AzureWebJobsHostLogs
+ YYYY
+ MM
,範例如下:
AzureWebJobsHostLogs202212
你要是不知道有這個表格的存在,你的荷包就會在不經意之中漸漸的變小,就像煮蛙效應一樣,一開始沒感覺,等有感覺的時候,都不知道已經浪費多少錢了!
我查了一下,我們在 2018 年 11 月的時候,當月就累積了有 3,050,671 筆紀錄,而且每個月都在增加!
我剛剛也統計了一下 2022 年 8 月的紀錄,當月也有 3,823,679 筆紀錄,實在太驚人了,我真的沒意識到這些記錄會累積!
如何清除過期的紀錄
因為我是最近才發現這些占空間的東西,所以累積了好幾十個表格要刪除,因此我寫了一支簡單的 PowerShell 腳本,方便我快速刪除這些資料:
-
先列出所有儲存體表格
$json = az storage table list --account-name 'mystor' -o json --only-show-errors
其中 mystor
是我的儲存體帳戶名稱。
-
篩選出想要刪除的表格清單
$json |
ConvertFrom-Json |
where { -not ($_.name -like 'AzureWebJobsHostLogs202212') }
以上範例僅保留當月的紀錄。
-
透過 az storage table delete
刪除表格
$json |
ConvertFrom-Json |
where { -not ($_.name -like 'AzureWebJobsHostLogs202212') }
foreach {
echo "az storage table delete --name $($_.name) --account-name mystor -o json --only-show-errors"
az storage table delete --name $($_.name) --account-name 'mystor' -o json --only-show-errors
}
以上範例僅保留當月的紀錄。
如果你只想刪除 2020
之前的紀錄,可以這樣執行:
$json |
ConvertFrom-Json |
where { $_.name -like 'AzureWebJobsHostLogs201*' }
foreach {
echo "az storage table delete --name $($_.name) --account-name mystor -o json --only-show-errors"
az storage table delete --name $($_.name) --account-name 'mystor' -o json --only-show-errors
}
如何停用執行記錄
像是測試環境,只要網站上線後,其實不太需要再記錄這些資訊,因此你大可關閉記錄功能。你只要從 Function App 的「應用程式設定」中刪除 AzureWebJobsDashboard
這個設定,日後就不會寫入 Log 了!
如果你的 Function App 有使用到 Blob Trigger 觸發器,那你可能會有個 AzureWebJobsStorage
應用程式設定,這個設定通常與 AzureWebJobsDashboard
是相同的,但有些開發人員非常有可能會直接參考 AzureWebJobsDashboard
這個應用程式設定來取得 Storage account 的連接字串,雖然這種狀況比較少見,但還是要特別注意一下,建議確認後再刪除這個 AzureWebJobsDashboard
應用程式設定。
相關連結