近日實作一支小程式,需求須落下相關Log,目前有很多OpenSource Lib能使用,但對於出入C++叢林的開發者來說要去學習這些Lib可能會需要花上許多時間
如果只是想簡單的落下程式執行的歷程或許我們能自己寫一個,今日分享的是透過freopen實作一支簡單的LogHelper
首先先看一下freopen這一個函數的定義與簡單的說明:
freopen 需要#include <stdio.h>
freopen 函數定義:FILE * freopen ( const char * filename, const char * mode, FILE * stream );
第一個字串為檔案名稱(可以是路徑+檔名),第二個字串則是開啟模式,第三個參數為串流流向(stdint、stdout)。
開啟模式僅先列出常用到的:
模式 | 功能 |
---|---|
"r" | 讀取文字檔案 |
"w" | 新建文字檔案並寫入資料 |
"a" | 將資料附加在該文字檔案之後(Append) |
接著我們來看看程式碼的部分:
1. LogHelper.h :定義Class LogHelper有哪些Function
/** File: LogHelper.cpp(h)
* Brief: 下Log小幫手
* Author: Egan
* Date 2017/08/16
*/
#ifndef LOGHELPER_H
#define LOGHELPER_H
#endif
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <iostream>
#include <string.h>
#include <sys/types.h>
class LogHelper {
private:
static std::string _logPath;
public:
/* @brief: 建構子 */
LogHelper();
/* @brief: Debug層級 */
static void debug(std::string msgStr);
/* @brief: 設定LogFile路徑 */
static void setLogFilePath(std::string pathStr);
};
2. LogHelper.cpp : Class LogHelper Function的內容實作
在C#最常使用的Log4Net紀錄下來的Log除了 Log訊息以外還會包含 日期時間、Log等級、Class Name、行數等資訊
為了讓此次的紀錄與分享不失焦所以將日期時間、Log等級的程式碼移除,留下將文字Append至文字檔中的程式碼段
#include "LogHelper.h"
std::string LogHelper::_logPath = "/root/CPlusPlusProjects/NTKServer/Untity/EganLog.log";
//這邊可改寫成Call設定檔Function來指定_logPath 實作於建構子內
LogHelper::LogHelper(){
}
void LogHelper::debug(std::string msgStr){
FILE *pfile;
pfile= freopen(_logPath.c_str(), "a", stdout);//將資料流輸入重新定向至參數一「_logPath」這個檔案
if(fPtr==NULL){
//重新定向失敗 do something for error
}
printf(msgStr.c_str());
printf("\n"); //換行
fclose(pfile);
freopen("/dev/tty","a",stdout); //將資料流輸入重新定向回標準輸出設備(Console視窗)
/**
*最後面的freopen("/dev/tty","a",stdout);
*是因為第一次freopen時已經將資料流輸入重新定向到"/root/CPlusPlusProjects/NTKServer/Untity/EganLog.log"
*所以執行printf("我是Log"); 會將"我是Log"寫入EganLog.log文字檔內
*如果沒有重新定向回來,而主程式執行了printf("Egan"); 結果則是不同於預期的在Console視窗印出字串Egan
*/
}
參考資料:http://blog.csdn.net/a656343072/article/details/40539889
egan2608@gmail.com