問題
? ? ? ? 項目里使用了?AzureBlob 存儲了用戶上傳的各種資源文件,近期?AzureBlob 的流量費用增長很快,想通過分析Blob的日志,獲取一些可用的信息,所以有了這個需求:將存儲賬戶的日志(讀寫,審計,監控等)通過Azure Event Hubs 發送到我的 elasticsearch, 并且發送給elasticsearch的日志進行必要的加工,即從中解析出一些特別的字段,方便分析。
實現步驟
1. 配置 Azure Blob 存儲日志記錄
Azure Blob 存儲提供日志記錄功能,你可以啟用存儲帳戶的活動日志(例如:讀取、寫入、審計等)以便后續處理。具體步驟如下:
- 啟用日志記錄:
- 進入 Azure 門戶,選擇你的存儲賬戶。
- 在 監控 部分,選擇 診斷設置。
- 創建一個新的診斷設置,啟用 Blob 存儲 服務的相關日志項(例如,讀取、寫入、刪除、審計日志等)。
- 選擇將日志輸出到 Event Hubs,并選擇一個已配置的 Event Hub 實例作為目標。
2. 創建 Azure Event Hubs
Event Hubs 將會作為一個中介,接收來自 Azure Blob 存儲的日志并將其轉發到 Elasticsearch。具體步驟如下:
- 創建 Event Hubs 命名空間:
- 在 Azure 門戶中,選擇 創建資源,然后選擇 Event Hubs。
- 創建一個新的 Event Hubs 命名空間并選擇合適的區域。
- 在命名空間下創建一個新的 Event Hub 實例。

3. 配置 Azure Function 解析日志
為了根據你的需要解析日志數據并發送到 Elasticsearch,你可以使用 Azure Function。此函數將從 Event Hubs 獲取日志數據,解析日志內容并將它們轉發到 Elasticsearch。你可以選擇編寫自定義代碼來實現日志解析。
-
創建 Azure Function:
- 在 Azure 門戶中,選擇 創建資源,然后選擇 Function App。
- 創建一個新的 Function App,選擇合適的區域和運行時堆棧(通常是 .NET 或 Node.js)。
- 在 Function App 中,創建一個新的 Event Hub Trigger 函數,以便在日志數據到達 Event Hub 時自動觸發。
-
編寫函數代碼:
-
在函數代碼中,你可以使用以下技術解析日志數據:
- 解析日志內容:提取你需要的字段(如操作類型、文件名、時間戳、請求者 IP 等)。
- 使用 JSON 處理庫:如果日志是 JSON 格式,你可以使用相關庫(如
JSON.parse()或.NET的JsonSerializer)來解析數據。 - 創建 Elasticsearch 客戶端:使用 Azure Function 的客戶端庫或 Elastic Search .NET 客戶端(或其他語言的客戶端)將解析后的日志發送到 Elasticsearch。
示例代碼(JavaScript,Node.js 環境):
const { Client } = require('@elastic/elasticsearch'); const client = new Client({ node: 'http://your-elasticsearch-server:9200' });module.exports = async function (context, eventHubMessages) {for (const message of eventHubMessages) {try {const logData = JSON.parse(message.body);// 提取你需要的字段const logEntry = {timestamp: logData.timestamp,operation: logData.operationName,blobName: logData.blobName,requestor: logData.requestorIp};// 將數據發送到 Elasticsearchawait client.index({index: 'storage-logs',document: logEntry});} catch (err) {context.log('Error processing message: ', err);}} };
-
-
部署 Azure Function:部署并運行該 Azure Function,它將自動從 Event Hubs 獲取日志消息,進行解析,并將結果推送到 Elasticsearch。
4. 配置 Elasticsearch 和 Kibana
在 Elasticsearch 中,你需要創建合適的索引模板和映射,以便于后續檢索和分析。你還可以使用 Kibana 來可視化日志數據。
-
配置索引模板和映射:
- 在 Elasticsearch 中,你可以為
storage-logs索引定義自定義映射,確保字段類型(如時間戳、IP 地址等)符合預期,方便查詢。
示例映射(適用于上述日志):
PUT /storage-logs {"mappings": {"properties": {"timestamp": { "type": "date" },"operation": { "type": "keyword" },"blobName": { "type": "text" },"requestor": { "type": "ip" }}} } - 在 Elasticsearch 中,你可以為
-
創建 Kibana 儀表板:
- 在 Kibana 中,創建新的索引模式(Index Pattern),指向
storage-logs索引。 - 然后,使用 Kibana 創建查詢、儀表板和可視化,幫助你對存儲日志進行實時分析。
- 在 Kibana 中,創建新的索引模式(Index Pattern),指向
5. 使用 Logstash (可選)
如果你不想使用 Azure Function 來解析日志數據,另一個選擇是使用 Logstash,它是 Elastic Stack 的一部分,可以幫助你從 Event Hubs 中提取數據并進行解析,然后將其發送到 Elasticsearch。
-
配置 Logstash:
- 安裝 Logstash 并配置它從 Azure Event Hubs 獲取數據。可以使用 Event Hub Input Plugin 連接到 Event Hub。
- 在 Logstash 配置中,使用過濾器(如
json過濾器)來解析日志數據并轉換字段,最后將數據輸出到 Elasticsearch。
示例 Logstash 配置文件:
input {azure_event_hubs {connection_string => "your-event-hub-connection-string"codec => json} }filter {json {source => "message"}mutate {add_field => {"timestamp" => "%{[timestamp]}""operation" => "%{[operationName]}"}} }output {elasticsearch {hosts => ["http://your-elasticsearch-server:9200"]index => "storage-logs"document_type => "_doc"} }
6. 測試和監控
- 測試:在你配置完成之后,開始生成一些 Azure Blob 存儲的日志(例如,進行文件操作)。確保這些日志通過 Event Hub 傳遞到 Azure Function 或 Logstash,成功解析并被發送到 Elasticsearch。
- 監控:通過 Azure Monitor、Event Hubs 和 Elasticsearch 的監控工具來查看系統的運行狀態和日志處理情況。
注意事項
- 性能:Event Hubs 可以支持高吞吐量的日志數據傳輸,但要確保 Event Hubs 的吞吐量單位(TU)配置合理,以處理日志的高并發傳輸。
- 數據延遲:從 Blob 存儲到 Elasticsearch 的數據傳輸可能存在一定的延遲,尤其是在高負載情況下。可以通過優化 Event Hubs 和 Azure Function 的配置來減少延遲。
- 日志解析:在解析日志時,要確保正則表達式、JSON 解析等操作高效執行,避免性能瓶頸。
- 安全性:確保在使用 Event Hubs 和 Elasticsearch 時啟用適當的身份驗證和加密,避免敏感數據泄露。
- 索引管理:Elasticsearch 中的日志數據可能會迅速增長,因此需要定期管理索引,如設置索引生命周期管理(ILM)以避免索引膨脹。
通過這種方式,你可以實現將 Azure Blob 存儲的日志通過 Event Hubs 發送到 Elasticsearch,并根據需要解析并優化日志的結構,以便在 Elasticsearch 中進行更高效的查詢和分析。
前情后續:
將 AzureBlob 的日志通過 Azure Event Hubs 發給 Elasticsearch(1)-CSDN博客
將 AzureBlob 的日志通過 Azure Event Hubs 發給 Elasticsearch(2)-CSDN博客
將 AzureBlob 的日志通過 Azure Event Hubs 發給 Elasticsearch(3)-CSDN博客
