C 遍歷日誌log目錄,並提取資料進行分析

2021-08-04 16:45:16 字數 2778 閱讀 1129

1 前言

我們經常在編寫軟體的時候,需要載入log檔案來記錄程式執行過程中可能會出現的bug,或者記錄一些重要的執行資訊。一旦乙個目錄下生成很多log檔案後,實際上我們管理與分析還是需要費一些時間的。這其中就需要我們懂得怎樣讀取log檔案,怎樣遍歷目錄,怎樣解析資料等等一系列操作。

下面我們直接通過乙個例項來了解各個部分是如何實現的,這個例項的要求如下:

①、d盤log目錄下有很多.log檔案,我們需要從每個檔案中提取資料(隱藏兩個任務:開啟讀取檔案;遍歷目錄);

②、我們需要從檔案中提取speed關鍵字後面對應的資料放入到excel**.csv檔案中。

2 程式實現

2.1 讀取檔案

以前從c開始我們就學習了使用fopen()開啟檔案,fread()讀取資訊,後來由於存在不安全性,又有了類似的fopen_s()相關定義。但是本次我們使用更上層一些的流操作來讀取檔案,該類方法定義在#include中,實現如下:

#include

using

namespace

std;

void getlog(const

string& file)

logfile.close(); // 關閉檔案

}

上面的ifstream類是用來構造讀取檔案物件的類,對應還有構造輸出到檔案的物件的類ofstream。如果既存在讀入和訪問,有fstream類,根據自己的需要定義對應的類,然後後面我們就可以像終端上流輸入輸出一樣處理載入的資料。

2.2 遍歷日誌目錄

有了上面的檔案讀取功能函式,下面我們來看看如何載入乙個目錄下所有log檔案來進行讀取與分析。這裡主要用到#include標頭檔案中定義的_findfirst()和_findnext()函式介面來依次讀取所有檔案,以及構造結構體 _finddata_t物件來儲存目錄下檔案基本資訊。我們還是直接看程式:

#include// 字串類

#include// 遍歷操作

struct _finddata_t fileinfo; // 儲存檔案資訊的結構體物件

string file = "d:/log/"; // 放置log檔案的目錄

string strfile = file + "*.log";

/***遍歷目錄系統函式要求先嘗試尋找乙個檔案,看是否存在***/

long handle;

if ((handle = _findfirst(strfile.c_str(), &fileinfo)) == -1l)

else

coutreport.close(); // 釋放檔案載入

_findclose(handle); // 釋放遍歷目錄的控制代碼

}

2.3 資料處理

我們的案例中是乙個小小的處理要求,就是對log檔案下提取一下speed關鍵字後面記錄的資料。這裡提取資料並一一對所有字串處理的操作主要用到定義在#include中字串流操作的stringstream類。跟fstream中定義的一樣,istringstream類是從檔案讀入資料,而ostringstream類是將資料存入檔案,而stringstream類就是兩種操作都可以。程式如下:

#include// 字串流操作

#include// 字串類

#include// 遍歷操作

using

namespace

std;// 標準庫命名空間

const

char* coutfile = "d:/log/output.csv"; // 輸出提取資料到csv檔案

// 上面隔行讀入的資料

while (getline(logfile, str))

}str.clear(); // 重複載入,所以每次需要清空

}

3 完整參考程式

#include// cin、cout

#include// 包含檔案讀取類與方法

#include// 字串流操作

#include// 字串類

#include// 遍歷操作

using

namespace

std;// 標準庫命名空間

string file = "d:/log/"; // 放置log檔案的目錄

const

char* coutfile = "d:/log/output.csv"; // 輸出提取資料到csv檔案

ofstream coutreport(coutfile); // 構建輸出結果檔案類物件

void getinfo(const

string& filepath)

}str.clear(); // 重複載入,所以每次需要清空

}// 關閉檔案

logfile.close();

}int main()

else

coutreport.close(); // 釋放檔案載入

_findclose(handle); // 釋放遍歷目錄的控制代碼

}return

0;}

c 實現log日誌檔案

1 在專案的執行過程中需要記錄或現實 的執行流程和錯誤資訊,但在不同的階段需要的功能不同 除錯階段 需要在螢幕顯示執行過程和錯誤資訊 運營階段 需要在檔案中記錄下來執行過程和錯誤資訊 2 根據錯誤原因一般段錯誤分為收下四個等級 致命錯誤 log fatal 警告 log warning 錯誤 log...

C 分析 IIS 日誌 Log

由於最近又要對 iis日誌 log 分析,以便得出各個搜尋引擎每日抓取的頻率,所以這兩天一直在嘗試各個辦法來分析 iis 日誌 log 其中嘗試過 匯入資料庫 log parser powsershell 等等方法,最後改用的是c 讀取 iis 日誌的方法,效能最好,定製化也比較能滿足需求。讀取 1...

C 分析 IIS 日誌 Log

由於最近又要對 iis日誌 log 分析,以便得出各個搜尋引擎每日抓取的頻率,所以這兩天一直在嘗試各個辦法來分析 iis 日誌 log 其中嘗試過 匯入資料庫 log parser powsershell 等等方法,最後改用的是c 讀取 iis 日誌的方法,效能最好,定製化也比較能滿足需求。讀取 1...