[C++]透過freopen實作簡單LogHelper

近日實作一支小程式,需求須落下相關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