天天看點

儲存log時,根據不同級别采用不同顔色區分,檔案儲存為Html或者輸出到控制台

為了保持可擴充性,将控制台顔色設定和儲存檔案顔色設定分别用兩個頭檔案。 此外,因為log可能需要在整個工程的不同類中輸出資訊,是以将檔案輸出類中設計為 靜态資料成員,友善調用。

很簡單,直接看代碼吧。

#ifndef COUT_TO_FILE_H #define COUT_TO_FILE_H

#include <iostream> #include <fstream> #include <string>

using namespace std;

class CoutToFile { public:     typedef enum { NONE= 0, DEBUG = 1, ERROR = 2,  FATAL= 3} LogLevels;     static bool isCoutToFile;     static ofstream ofObj;     static streambuf* coutBuf;     static streambuf* fileBuf;     static void SaveLog(string info, LogLevels level); };

#endif

設定輸出到控制台的顔色,預設顔色是白色,可以根據需求cout時選擇響應的顔色。 該段代碼參考引用自: http://wenku.baidu.com/view/6593f5631ed9ad51f01df2ae.html

#ifndef CONSOLE_COLORS_H #define CONSOLE_COLORS_H #include <iostream> #include <windows.h> using namespace std; inline std::ostream& blue(std::ostream &s) {     HANDLE hStdout=GetStdHandle(STD_OUTPUT_HANDLE);     SetConsoleTextAttribute(hStdout,FOREGROUND_BLUE|FOREGROUND_GREEN|FOREGROUND_INTENSITY);     return s; }

inline std::ostream& red(std::ostream &s) {     HANDLE hStdout=GetStdHandle(STD_OUTPUT_HANDLE);     SetConsoleTextAttribute(hStdout,FOREGROUND_RED|FOREGROUND_INTENSITY);     return s; }

inline std::ostream& green(std::ostream &s) {     HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);     SetConsoleTextAttribute(hStdout,FOREGROUND_GREEN|FOREGROUND_INTENSITY);     return s; }

inline std::ostream& yellow(std::ostream &s) {     HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);     SetConsoleTextAttribute(hStdout,FOREGROUND_GREEN|FOREGROUND_RED|FOREGROUND_INTENSITY);     return s; }

inline std::ostream& white(std::ostream &s) {     HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);     SetConsoleTextAttribute(hStdout, FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);     return s; }

#endif

#include "CoutToFile.h" #include "ConsoleColor.h"

const string RED_BEGIN_TAG = "<span style=\"color: red;\">"; const string BLACK_BEGIN_TAG = "<span style=\"color: black;\">"; const string END_TAG = "</span>"; const string BR_TAG = "<br/>";

ofstream CoutToFile::ofObj; streambuf* CoutToFile::coutBuf = cout.rdbuf(); streambuf* CoutToFile::fileBuf = CoutToFile::ofObj.rdbuf(); bool CoutToFile::isCoutToFile = false;

void CoutToFile::SaveLog(string info, LogLevels level) {     if(isCoutToFile)     {         if(level==3 || level==2 )         {             cout<<RED_BEGIN_TAG<<endl;         }         else         {             cout<<BLACK_BEGIN_TAG<<endl;         }

        cout<<info<<BR_TAG<<endl;

        cout<<END_TAG<<endl;     }     else     {         if( level== 2 || level==3 )         {             cout<<red<<info<<white<<endl;         }         else         {             cout<<white<<info<<endl;         }     } }

注釋:if語句中的enum類型比較,還有一點還有問題。采用整形比較沒有問題,但是采用注釋中的類型比較,就會進到錯誤的邏輯。目前還沒有搞清楚。有清楚的同學請留言啊。

#include <iostream> #include <fstream> #include "CoutToFile.h"

using namespace std;

void SettingCout(string logSavePath, bool isSaveToFile) {     CoutToFile::isCoutToFile = isSaveToFile;

    if(CoutToFile::isCoutToFile)     {         CoutToFile::ofObj.open(logSavePath.c_str() );         cout.rdbuf(CoutToFile::fileBuf);     }     else     {         cout.rdbuf(CoutToFile::coutBuf);     } }

void ResetCout() {     if(CoutToFile::isCoutToFile)     {         cout.rdbuf(CoutToFile::coutBuf);         CoutToFile::ofObj.close();     } }

int main(int argc, char* argv[]) {     bool isCoutLogToFile = false;          string logSavePath = "d:/Log.html";     SettingCout(logSavePath, isCoutLogToFile);

    string name = "Name:Walle";     string sex = "Sex: Male";     string blog = "Blog:: http://blog.csdn.net/johnnyelf83";          CoutToFile::SaveLog(name, CoutToFile::NONE);     CoutToFile::SaveLog(sex, CoutToFile::NONE);     CoutToFile::SaveLog(blog, CoutToFile::FATAL);          ResetCout();

    system("PAUSE");     return 0; }

輸出: 1. 設定輸出到控制台:

儲存log時,根據不同級别采用不同顔色區分,檔案儲存為Html或者輸出到控制台

2. 設定輸出到html檔案:

儲存log時,根據不同級别采用不同顔色區分,檔案儲存為Html或者輸出到控制台

繼續閱讀