自己设计了一个小的Log工具,主要是想加强下自己linux下的编码能力,及程序的设计能力。
希望有共同目标的同学一起讨论下,大家一起多弄些小的实例,共同讨论下,增强下程序设计方面的知识、经验。
-------------------------------
Log使用说明:
日志记录项说明:
2012-11-23 11:50:50 [12257 : 12257] [main.cpp : int main(int, char**)] :hahhaha
日期 时间 进程号 线程号 文件名 函数名 自定义消息
使用方式:
创建:
WYKLog* logStdOut = LogStdOut::getLogStdOut(); //屏幕输出 绿色
WYKLog* logStdErr = LogStdErr::getLogStdErr(); //屏幕输出 红色
WYKLog* logStdFile = LogFile::getLogFile(dir, filePreFix, 10);
// 记录到日志文件, 文件名 “filePreFix2012-11-23.log" 前缀+日期.log
// 文件存放到dir指定目录下
// 每隔10天生成一个新的日志文件
WYKLog* logStdFile = LogFile::getLogFile();
// 默认创建 "./log-dir"文件夹
// 文件没有前缀 "日期.log"
// 每隔7天生成一个新的日志文件
记录:
logXXX->m_log("自己的消息");
---------------------------------------
源码:
log.h 文件:
#ifndef _LOG_H_
#define _LOG_H_
/*====================================================================
*
* 功能 :
*
* 作者 : WYK
*
* 日期 : 2012年11月22日 星期四 11时49分33秒
*
====================================================================*/
#include <sys/types.h>
#include <stdio.h>
#include <string>
#define m_log(msg) log(__FILE__, __PRETTY_FUNCTION__, msg)
class WYKLog
{
public:
bool log(const char* file, const char* func,const char* msg);
protected:
WYKLog();
virtual bool record(const char* tip,const char* msg) = 0;
private:
WYKLog(WYKLog&);
WYKLog& operator=(WYKLog&);
private:
pid_t pid;
};
class LogStdOut: public WYKLog
{
public:
static LogStdOut* getLogStdOut();
protected:
bool record(const char* tip, const char* msg);
private:
LogStdOut(){};
~LogStdOut(){};
LogStdOut(LogStdOut&){};
LogStdOut& operator=(LogStdOut&){};
private:
static LogStdOut* singleInstance;
};
class LogStdErr: public WYKLog
{
public:
static LogStdErr* getLogStdErr();
protected:
bool record(const char* tip, const char* msg);
private:
LogStdErr(){};
~LogStdErr(){};
LogStdErr(LogStdErr&){};
LogStdErr& operator=(LogStdErr&){};
private:
static LogStdErr* singleInstance;
};
class LogFile: public WYKLog
{
public:
static LogFile* getLogFile(const char* dir, const char* _preFix, int _day = 7);
static LogFile* getLogFile();
~LogFile();
protected:
bool record(const char* tip, const char* msg);
private:
LogFile(const char* dir, const char* _preFix, int _day);
bool greaterTimeSeg();
bool newLogFile();
void closeLogFile();
LogFile(LogFile&);
LogFile& operator=(LogFile&);
private:
FILE* file;
time_t start;
static LogFile* singleInstance;
std::string preFix;
int preFixLen;
int timeSeg;
};
#endif
logStdErr.cpp文件
/*===================================================================
*
* 功能 :
*
* 作者 : WYK
*
* 日期 : 2012年11月23日 星期五 09时57分28秒
*
===================================================================*/
#include "log.h"
#include <stdio.h>
#include <string>
LogStdErr* LogStdErr::singleInstance = NULL;
LogStdErr* LogStdErr::getLogStdErr()
{
if(NULL == singleInstance)
{
try{singleInstance = new LogStdErr();}
catch(std::bad_alloc e)
{
printf("\033[31m new LogStdErr error\033[0m\n");
return NULL;
}
}
return singleInstance;
}
bool LogStdErr::record(const char* tip, const char* msg)
{
if(NULL == msg)
printf("\033[31m %s \033[0m\n", tip);
else
printf("\033[31m %s %s \033[0m\n",tip, msg);
return true;
}
////////////////////////////////////////////////////////////////////
// END
logStdOut.cpp文件
/*===================================================================
*
* 功能 :
*
* 作者 : WYK
*
* 日期 : 2012年11月22日 星期四 11时50分45秒
*
===================================================================*/
#include "log.h"
#include <stdio.h>
#include <string>
LogStdOut* LogStdOut::singleInstance = NULL;
LogStdOut* LogStdOut::getLogStdOut()
{
if(NULL == singleInstance)
{
try{singleInstance = new LogStdOut();}
catch(std::bad_alloc e)
{
printf("\033[31m new LogStdOut error\033[0m\n");
return NULL;
}
}
return singleInstance;
}
bool LogStdOut::record(const char* tip, const char* msg)
{
if(NULL == msg)
printf("\033[32m %s \033[0m\n", tip);
else
printf("\033[32m %s %s \033[0m\n",tip, msg);
return true;
}
////////////////////////////////////////////////////////////////////
// END
logFile.cpp文件
/*===================================================================
*
* 功能 :
*
* 作者 : WYK
*
* 日期 : 2012年11月22日 星期四 11时50分31秒
*
===================================================================*/
#include <sys/stat.h>
#include <sys/types.h>
#include <dirent.h>
#include "log.h"
const int DAY_SEC = 24*3600;
LogFile* LogFile::singleInstance = NULL;
LogFile* LogFile::getLogFile(const char* dir, const char* _preFix, int _day)
{
if(NULL == singleInstance)
{
try{singleInstance = new LogFile(dir, _preFix, _day);}
catch(std::bad_alloc e)
{
printf("\033[31m new LogFile error \033[0m\n");
return NULL;
}
catch(int e)
{
return NULL;
}
}
return singleInstance;
}
LogFile* LogFile::getLogFile()
{
if(NULL == singleInstance)
{
try{singleInstance = new LogFile(NULL, NULL, 7);}
catch(std::bad_alloc e)
{
printf("\033[31m new LogFile error \033[0m\n");
return NULL;
}
catch(int e)
{
return NULL;
}
}
return singleInstance;
}
LogFile::LogFile(const char* dir, const char* _preFix, int _day):file(NULL),start(0)
{
if(NULL == dir || 0 == *dir)
{
dir = "./log-dir";
}
if(-1 == access(dir, 0))
{
if(mkdir(dir, 0777))
{
printf("\033[31m make dir error\033[0m\n");
throw (-1);
}
}
else
{
DIR* dp;
if(NULL == (dp=opendir(dir)))
{
printf("\033[31m dirName exits, but not dir error\033[0m\n");
throw (-2);
}
else
closedir(dp);
}
preFix = dir;
if('/' != dir[strlen(dir)-1])
{
preFix += "/";
}
if(NULL != _preFix)
{
preFix += _preFix;
}
preFixLen = preFix.length();
if(_day > 30)
_day = 30;
timeSeg = DAY_SEC * _day;
}
LogFile::~LogFile()
{
closeLogFile();
}
bool LogFile::record(const char* tip, const char* msg)
{
if(greaterTimeSeg())
newLogFile();
fwrite(tip, strlen(tip), 1, file);
fwrite(msg, strlen(msg), 1, file);
fwrite("\n", 1, 1, file);
return true;
}
bool LogFile::greaterTimeSeg()
{
time_t now;
time(&now);
if(now-start > timeSeg)
{
start = now;
return true;
}
else
{
return false;
}
}
bool LogFile::newLogFile()
{
char fileName[256];
strcpy(fileName, preFix.c_str());
time_t now;
time(&now);
strftime(fileName+preFixLen, 20, "_%Y-%m-%d.log", localtime(&now));
closeLogFile();
file = fopen(fileName, "w");
if(NULL == file)
return false;
else
return true;
}
void LogFile::closeLogFile()
{
if(NULL != file)
{
fclose(file);
file = NULL;
}
}
////////////////////////////////////////////////////////////////////
// END
test.cpp
/*===================================================================
*
* 功能 :
*
* 作者 : WYK
*
* 日期 : 2012年11月22日 星期四 15时09分59秒
*
===================================================================*/
#include "log.h"
#include <stdio.h>
#include <pthread.h>
//g++ -g log.cpp logStdOut.cpp logStdErr.cpp logFile.cpp main.cpp -o log
//g++ -g main.cpp liblog.a -L/usr/lib/ntpl -lpthread -o log
WYKLog* logOut = NULL;
WYKLog* logErr = NULL;
WYKLog* logFile = NULL;
void* threadFunc(void* arg);
int main(int argc, char** argv)
{
logOut = LogStdOut::getLogStdOut();
if(NULL == logOut)
{
printf("logOut get error\n");
exit(1);
}
logOut->m_log("stdout : kkkkkkkkk");
logErr = LogStdErr::getLogStdErr();
if(NULL == logErr)
{
printf("logErr get error\n");
exit(1);
}
logErr->m_log("stderr : llllllllll");
logFile = LogFile::getLogFile("./log-dir", "test", 7);
if(NULL == logFile)
{
printf("logFile get error\n");
exit(1);
}
pthread_t thread1;
int ret = pthread_create(&thread1, NULL, threadFunc, NULL);
if(0 != ret)
{
printf("create thread error\n");
exit(1);
}
int i = 0;
while(i++ < 10)
{
logOut->m_log("stdout : kkkkkkkkk");
logErr->m_log("stderr : lllllllll");
logFile->m_log("hahhaha");
usleep(5*1000000);
}
return 0;
}
void* threadFunc(void* arg)
{
printf("====in child thread===\n");
int i = 0;
while(i++ < 5)
{
printf("====go child thread===\n");
logFile->m_log("abcdefghi");
usleep(10*1000000);
}
}
////////////////////////////////////////////////////////////////////
// END
有设计不合理的地方,希望大家指点下,万分感谢!