博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
撰写日志类
阅读量:6438 次
发布时间:2019-06-23

本文共 4920 字,大约阅读时间需要 16 分钟。

ExpandedBlockStart.gif
 
/* 
InBlock.gifLog File Library(WIN98/NT/2000) 
InBlock.gif
InBlock.gifCompile by: BC++ 5; C++ BUILDER; VC++; VC.NET; 
InBlock.gif
InBlock.gifcopyright(c) 2004.5 - 2005.3  llbird wushaojian@21cn.com 
 http://blog.csdn.net/wujian53 
InBlock.gif 
ExpandedBlockEnd.gif 
*/ 
ExpandedBlockStart.gif 
/* 
InBlock.gifUse:
InBlock.gif//这个代码我用工业现场24X7值守的程序纪录各种信息, 简单易用;
InBlock.gif//一般用一个全局日志对象, 有临界排斥可以多线程安全使用。
InBlock.gif//有两个类
InBlock.gifclass LogFile;//用户定义日志文件名
InBlock.gifclass LogFileEx;//有日志文件名自动生成功能 , 可分年月日频率生成文件名, 可指定日志存放的目录
InBlock.gif
InBlock.gifLogFile gLog("My.Log");
InBlock.gifgLog.Log("test", 4);//记录日志
InBlock.gifgLog.Log("系统启动");
InBlock.gif
InBlock.gifLogFileEx gLog(".", LogFileEx :: YEAR);//一年生成一个日志文件
InBlock.gifLogFileEx gLog(".\\Log", LogFileEx :: MONTH);//一月生成一个日志文件
InBlock.gifLogFileEx gLog(".\\Log", LogFileEx :: DAY);//一天生成一个日志文件
InBlock.gif//注意日志所属目录创建失败会自动退出, 请注意目录的合法性, 文件生成频率看情况掌握
InBlock.gif//24小时运行的程序可以每天生成一个日志文件, 以免内容过多
ExpandedBlockEnd.gif
 */ 
None.gif 
None.gif#ifndef _LOGFILE_H
None.gif
 
#define
 
 _LOGFILE_H
 
None.gif 
None.gif#include 
 
<
 
assert.h
 
>
 
None.gif#include 
 
<
 
time.h
 
>
 
None.gif#include 
 
<
 
stdio.h
 
>
 
None.gif#include 
 
<
 
windows.h
 
>
 
None.gif 
None.gif 
class
 
 LogFile
ExpandedBlockStart.gif
 
{
InBlock.gif protected :
InBlock.gif
InBlock.gif CRITICAL_SECTION _csLock;
InBlock.gif  char   *  _szFileName;
InBlock.gif HANDLE _hFile;
InBlock.gif
InBlock.gif  bool  OpenFile() // 打开文件, 指针到文件尾 
ExpandedSubBlockStart.gif 
  {
InBlock.gif   if (IsOpen())
InBlock.gif    return   true ;
InBlock.gif
InBlock.gif   if ( ! _szFileName)
InBlock.gif    return   false ;
InBlock.gif
InBlock.gif  _hFile  =   CreateFile(
InBlock.gif   _szFileName, 
InBlock.gif   GENERIC_WRITE,
InBlock.gif   FILE_SHARE_READ  |  FILE_SHARE_WRITE,
InBlock.gif   NULL,
InBlock.gif   OPEN_EXISTING,
InBlock.gif   FILE_ATTRIBUTE_NORMAL,
InBlock.gif   NULL 
InBlock.gif  );
InBlock.gif
InBlock.gif   if ( ! IsOpen()  &&  GetLastError()  ==   2 ) // 打开不成功, 且因为文件不存在, 创建文件 
InBlock.gif 
   _hFile  =   CreateFile(
InBlock.gif    _szFileName, 
InBlock.gif    GENERIC_WRITE,
InBlock.gif    FILE_SHARE_READ  |  FILE_SHARE_WRITE,
InBlock.gif    NULL,
InBlock.gif    OPEN_ALWAYS,
InBlock.gif    FILE_ATTRIBUTE_NORMAL,
InBlock.gif    NULL 
InBlock.gif   );  
InBlock.gif
InBlock.gif   if (IsOpen())
InBlock.gif   SetFilePointer(_hFile,  0 , NULL, FILE_END);
InBlock.gif
InBlock.gif   return  IsOpen();
ExpandedSubBlockEnd.gif } 
InBlock.gif 
InBlock.gif DWORD Write(LPCVOID lpBuffer, DWORD dwLength)
ExpandedSubBlockStart.gif  {
InBlock.gif  DWORD dwWriteLength  =   0 ;
InBlock.gif
InBlock.gif   if (IsOpen())
InBlock.gif   WriteFile(_hFile, lpBuffer, dwLength,  & dwWriteLength, NULL);
InBlock.gif
InBlock.gif   return  dwWriteLength;
ExpandedSubBlockEnd.gif } 
InBlock.gif 
InBlock.gif  virtual   void  WriteLog( LPCVOID lpBuffer, DWORD dwLength) // 写日志, 可以扩展修改 
ExpandedSubBlockStart.gif 
  {
InBlock.gif  time_t now;
InBlock.gif   char  temp[ 21 ];
InBlock.gif  DWORD dwWriteLength;
InBlock.gif
InBlock.gif   if (IsOpen())
ExpandedSubBlockStart.gif   {
InBlock.gif   time( & now);
InBlock.gif   strftime(temp,  20 ,  " %Y-%m-%d %H:%M:%S " , localtime( & now));
InBlock.gif
InBlock.gif   WriteFile(_hFile,  " \xd\xa#----------------------------- " ,  32 ,  & dwWriteLength, NULL);
InBlock.gif   WriteFile(_hFile, temp,  19 ,  & dwWriteLength, NULL);
InBlock.gif   WriteFile(_hFile,  " -----------------------------#\xd\xa " ,  32 ,  & dwWriteLength, NULL);
InBlock.gif   WriteFile(_hFile, lpBuffer, dwLength,  & dwWriteLength, NULL);
InBlock.gif   WriteFile(_hFile,  " \xd\xa " ,  2 ,  & dwWriteLength, NULL);
InBlock.gif   
InBlock.gif   FlushFileBuffers(_hFile);
InBlock.gif
ExpandedSubBlockEnd.gif  } 
ExpandedSubBlockEnd.gif } 
InBlock.gif 
ExpandedSubBlockStart.gif   void  Lock()   { ::EnterCriticalSection( & _csLock); } 
ExpandedSubBlockStart.gif   void  Unlock()  { ::LeaveCriticalSection( & _csLock); } 
InBlock.gif 
InBlock.gif public :
InBlock.gif  
InBlock.gif LogFile( const   char   * szFileName  =   " Log.log " ) // 设定日志文件名 
ExpandedSubBlockStart.gif 
  {
InBlock.gif  _szFileName  =  NULL;
InBlock.gif  _hFile  =  INVALID_HANDLE_VALUE;
InBlock.gif  ::InitializeCriticalSection( & _csLock);
InBlock.gif
InBlock.gif  SetFileName(szFileName);
ExpandedSubBlockEnd.gif } 
InBlock.gif 
InBlock.gif  virtual   ~ LogFile()
ExpandedSubBlockStart.gif  {
InBlock.gif  ::DeleteCriticalSection( & _csLock);
InBlock.gif  Close();
InBlock.gif
InBlock.gif   if (_szFileName)
InBlock.gif   delete []_szFileName;
ExpandedSubBlockEnd.gif } 
InBlock.gif 
InBlock.gif  const   char   *  GetFileName()
ExpandedSubBlockStart.gif  {
InBlock.gif   return  _szFileName;
ExpandedSubBlockEnd.gif } 
InBlock.gif 
InBlock.gif  void  SetFileName( const   char   * szName) // 修改文件名, 同时关闭上一个日志文件 
ExpandedSubBlockStart.gif 
  {
InBlock.gif  assert(szName);
InBlock.gif
InBlock.gif   if (_szFileName)
InBlock.gif   delete []_szFileName;
InBlock.gif
InBlock.gif  Close();
InBlock.gif
InBlock.gif  _szFileName  =   new   char [strlen(szName)  +   1 ];
InBlock.gif  assert(_szFileName);
InBlock.gif  strcpy(_szFileName, szName);
ExpandedSubBlockEnd.gif } 
InBlock.gif 
InBlock.gif  bool  IsOpen()
ExpandedSubBlockStart.gif  {
InBlock.gif   return  _hFile  !=  INVALID_HANDLE_VALUE;
ExpandedSubBlockEnd.gif } 
InBlock.gif 
InBlock.gif  void  Close()
ExpandedSubBlockStart.gif  {
InBlock.gif   if (IsOpen())
ExpandedSubBlockStart.gif   {
InBlock.gif   CloseHandle(_hFile);
InBlock.gif   _hFile  =  INVALID_HANDLE_VALUE;
ExpandedSubBlockEnd.gif  } 
ExpandedSubBlockEnd.gif } 
InBlock.gif 
InBlock.gif  void  Log(LPCVOID lpBuffer, DWORD dwLength) // 追加日志内容 
ExpandedSubBlockStart.gif 
  {
InBlock.gif  assert(lpBuffer);
InBlock.gif  __try
ExpandedSubBlockStart.gif   {
InBlock.gif   Lock();
InBlock.gif
InBlock.gif    if ( ! OpenFile())
InBlock.gif     return ;
InBlock.gif
InBlock.gif   WriteLog(lpBuffer, dwLength);
ExpandedSubBlockEnd.gif  } 
InBlock.gif  __finally
ExpandedSubBlockStart.gif   {
InBlock.gif   Unlock();
ExpandedSubBlockEnd.gif  }  
ExpandedSubBlockEnd.gif } 
InBlock.gif 
InBlock.gif  void  Log( const   char   * szText)
ExpandedSubBlockStart.gif  {
InBlock.gif  Log(szText, strlen(szText));
ExpandedSubBlockEnd.gif } 
InBlock.gif 
InBlock.gif private : // 屏蔽函数 
InBlock.gif 
InBlock.gif LogFile( const  LogFile & );
InBlock.gif LogFile & operator   =  ( const  LogFile & );
ExpandedBlockEnd.gif
;
None.gif
None.gif
 
class
 
 LogFileEx : 
 
public
 
 LogFile
ExpandedBlockStart.gif
 
{
InBlock.gif protected :
InBlock.gif
InBlock.gif  char   * _szPath;
InBlock.gif  char  _szLastDate[ 9 ];
InBlock.gif  int  _iType;
InBlock.gif
InBlock.gif  void  SetPath( const   char   * szPath)
ExpandedSubBlockStart.gif  {
InBlock.gif  assert(szPath);
InBlock.gif
InBlock.gif  WIN32_FIND_DATA wfd;
ExpandedSubBlockStart.gif   char  temp[MAX_PATH  +   1 ]  =   { 0 } ;
InBlock.gif
InBlock.gif   if (FindFirstFile(szPath,  & wfd)  ==  INVALID_HANDLE_VALUE  &&  CreateDirectory(szPath, NULL)  ==   0 )
ExpandedSubBlockStart.gif   {
InBlock.gif   strcat(strcpy(temp, szPath),  "  Create Fail. Exit Now! Error ID : " );
InBlock.gif   ltoa(GetLastError(), temp  +  strlen(temp),  10 );
InBlock.gif   MessageBox(NULL, temp,  " Class LogFileEx " , MB_OK);
InBlock.gif   exit( 1 );
ExpandedSubBlockEnd.gif  } 
InBlock.gif   else 
ExpandedSubBlockStart.gif    {
InBlock.gif   GetFullPathName(szPath, MAX_PATH, temp, NULL);
InBlock.gif   _szPath  =   new   char [strlen(temp)  +   1 ];
InBlock.gif   assert(_szPath);
InBlock.gif   strcpy(_szPath, temp);
ExpandedSubBlockEnd.gif  } 
ExpandedSubBlockEnd.gif } 
InBlock.gif 
InBlock.gif public :
InBlock.gif
ExpandedSubBlockStart.gif  enum  LOG_TYPE {YEAR  =   0 , MONTH  =   1 , DAY  =   2 } ;
InBlock.gif
InBlock.gif LogFileEx( const   char   * szPath  =   " . " , LOG_TYPE iType  =  MONTH)
ExpandedSubBlockStart.gif  {
InBlock.gif  _szPath  =  NULL;
InBlock.gif  SetPath(szPath);
InBlock.gif  _iType  =  iType;
InBlock.gif  memset(_szLastDate,  0 ,  9 );
ExpandedSubBlockEnd.gif } 
InBlock.gif 
InBlock.gif  ~ LogFileEx()
ExpandedSubBlockStart.gif  {
InBlock.gif   if (_szPath)
InBlock.gif   delete []_szPath;
ExpandedSubBlockEnd.gif } 
InBlock.gif 
InBlock.gif  const   char   *  GetPath()
ExpandedSubBlockStart.gif  {
InBlock.gif   return  _szPath;
ExpandedSubBlockEnd.gif } 
InBlock.gif 
InBlock.gif  void  Log(LPCVOID lpBuffer, DWORD dwLength)
ExpandedSubBlockStart.gif  {
InBlock.gif  assert(lpBuffer);
InBlock.gif
InBlock.gif   char  temp[ 10 ];
ExpandedSubBlockStart.gif   static   const   char  format[ 3 ][ 10 ]  =   { " %Y " ,  " %Y-%m " ,  " %Y%m%d " } ;
InBlock.gif  
InBlock.gif  __try
ExpandedSubBlockStart.gif   {
InBlock.gif   Lock();
InBlock.gif   
InBlock.gif   time_t now  =  time(NULL);
InBlock.gif
InBlock.gif   strftime(temp,  9 , format[_iType], localtime( & now));
InBlock.gif
InBlock.gif    if (strcmp(_szLastDate, temp)  !=   0 ) // 更换文件名 
ExpandedSubBlockStart.gif 
    {
InBlock.gif    strcat(strcpy(_szFileName, _szPath),  " \\ " );
InBlock.gif    strcat(strcat(_szFileName, temp),  " .log " );
InBlock.gif    strcpy(_szLastDate, temp);
InBlock.gif    Close();
ExpandedSubBlockEnd.gif   } 
InBlock.gif 
InBlock.gif    if ( ! OpenFile())
InBlock.gif     return ;
InBlock.gif   
InBlock.gif   WriteLog(lpBuffer, dwLength);
ExpandedSubBlockEnd.gif  } 
InBlock.gif  __finally
ExpandedSubBlockStart.gif   {
InBlock.gif   Unlock();
ExpandedSubBlockEnd.gif  } 
ExpandedSubBlockEnd.gif } 
InBlock.gif 
InBlock.gif  void  Log( const   char   * szText)
ExpandedSubBlockStart.gif  {
InBlock.gif  Log(szText, strlen(szText));
ExpandedSubBlockEnd.gif } 
InBlock.gif 
InBlock.gif private : // 屏蔽函数 
InBlock.gif 
InBlock.gif LogFileEx( const  LogFileEx & );
InBlock.gif LogFileEx & operator   =  ( const  LogFileEx & );
InBlock.gif
ExpandedBlockEnd.gif
;
None.gif
None.gif
 
#endif
 
你可能感兴趣的文章
同步异步阻塞非阻塞杂记
查看>>
2018年中国银行业十件大事,“Fintech深度融合,科技子公司遍地” ...
查看>>
Git SSH 连接phacility服务器
查看>>
【客户案例】智能驾驶行业如何上云?
查看>>
foreman源NO_PUBKEY 6F8600B9563278F6
查看>>
揭秘:蚂蚁金服bPaaS究竟是什么?
查看>>
mongo数据库单节点搭建
查看>>
WPF模糊和阴影效果
查看>>
增加关系型数据库驱动配置同步任务
查看>>
别用这种方式聊天,你都不知道自己是怎么聊死的
查看>>
中国香港地区 DDoS- botnet 态势分析
查看>>
另一个角度的架构师
查看>>
SparseArray<E>详解
查看>>
Eclipse-Java代码规范和质量检查插件-PMD
查看>>
阿里专家分享:企业级大数据轻量云实践
查看>>
阿里财报:云计算年度营收133亿,季度营收连续12个季度翻番
查看>>
人工智能化发展已经到了哪一步?
查看>>
php实现上传图片保存到数据库的方法
查看>>
安卓应用安全指南 5.4.3 通过 HTTPS 的通信 高级话题
查看>>
针对CMS中的tag标签理解
查看>>