此日志类,简单地实现了向标准输出控制台和文件输出日志信息的功能,并能在这两者之间进行切换输出,
满足输出日志的不同需求。
代码如下:
/*
* CCLog.h
* c++_common_codes
*
* Created by xichen on 12-1-12.
* Copyright 2012 cc_team. All rights reserved.
*
*/
#ifndef CC_LOG_H
#define CC_LOG_H
#include "ccString.h"
#include <cstdio>
typedef enum _LOG_TYPE
{
LOG_TYPE_CONSOLE,
LOG_TYPE_FILE,
LOG_TYPE_MAX
}LOG_TYPE;
class CCLog
{
public:
CCLog(const char * fileName = NULL, const char * mode = "at+"); // by default, open file by "at+" mode
~CCLog();
public:
unsigned write(const CCString & str);
unsigned writeEndl();
void clearAllData(); // if a file is opened, all contents of the file will be cleared, the file will be opened a second time.
public:
void setWriteToConsole();
void setWriteToFile();
public:
LOG_TYPE getLogType() const { return _logType; }
CCString getLogFileName() const { return _fileName; }
private:
void clearConsole() // not coding ok
{
}
private:
CCLog(const CCLog & log);
CCLog & operator=(const CCLog & log);
private:
FILE *_file;
FILE *_backupFile;
CCString _fileName;
LOG_TYPE _logType;
};
#endif
/*
* CCLog.cpp
* c++_common_codes
*
* Created by xichen on 12-1-12.
* Copyright 2012 cc_team. All rights reserved.
*
*/
#include "ccLog.h"
CCLog::CCLog( const char * fileName /*= NULL*/, const char * mode /*= "at+"*/ )
{
if(fileName == NULL)
{
_file = _backupFile = NULL;
_logType = LOG_TYPE_CONSOLE;
return;
}
_logType = LOG_TYPE_FILE;
_file = fopen(fileName, mode);
_backupFile = _file;
if(_file == NULL)
std::cerr << "Open file error" << std::endl;
else
_fileName = CCString(fileName);
}
CCLog::~CCLog()
{
if(_logType == LOG_TYPE_FILE)
{
if(_file != NULL)
{
fclose(_file);
return;
}
if(_backupFile != NULL)
{
fclose(_backupFile);
}
}
}
unsigned CCLog::write( const CCString & str )
{
if(_logType == LOG_TYPE_CONSOLE)
{
std::cout << str;
return str.length(); // it's not accurate. ????
}
fseek(_file, 0, SEEK_END);
return fwrite(str.c_str(), str.length(), 1, _file);
}
unsigned CCLog::writeEndl()
{
return write(CCString("\n"));
}
void CCLog::clearAllData()
{
if(_logType == LOG_TYPE_CONSOLE)
return;
if(_backupFile != NULL)
_file = _backupFile;
fclose(_file);
_file = fopen(CCString(_fileName), "wt+"); // clear all the data of file
_backupFile = _file;
if(_file == NULL)
std::cerr << "clearAllData:Open file error" << std::endl;
}
void CCLog::setWriteToConsole()
{
_logType = LOG_TYPE_CONSOLE;
}
void CCLog::setWriteToFile()
{
_logType = LOG_TYPE_FILE;
}
void ccTestLog()
{
#if 1 // CCLog
CCLog * log = new CCLog(NULL);
log->write("hello");
log->write("\t1\n");
log->write("\txichen\n");
delete log;
log = new CCLog("d:\\test\\logtest.txt");
log->write("ab\t\n1");
delete log;
log = new CCLog("d:\\test\\logtest.txt");
log->write("xiche\t123");
log->clearAllData();
log->write("after clear");
log->setWriteToConsole();
log->write("the console info");
log->setWriteToFile();
log->write("the file content");
log->writeEndl();
log->write("the next line\nhehe");
delete log;
#endif
}
注:#include "ccString.h" 头文件见上一篇:c++ string的简单实现