撰写日志类

 /* 
Log File Library(WIN98/NT/2000) 

Compile by: BC++ 5; C++ BUILDER; VC++; VC.NET; 

copyright(c) 2004.5 - 2005.3  llbird wushaojian@21cn.com  http://blog.csdn.net/wujian53 
 
 */ 
 /* 
Use:
//这个代码我用工业现场24X7值守的程序纪录各种信息, 简单易用;
//一般用一个全局日志对象, 有临界排斥可以多线程安全使用。
//有两个类
class LogFile;//用户定义日志文件名
class LogFileEx;//有日志文件名自动生成功能 , 可分年月日频率生成文件名, 可指定日志存放的目录

LogFile gLog("My.Log");
gLog.Log("test", 4);//记录日志
gLog.Log("系统启动");

LogFileEx gLog(".", LogFileEx :: YEAR);//一年生成一个日志文件
LogFileEx gLog(".\\Log", LogFileEx :: MONTH);//一月生成一个日志文件
LogFileEx gLog(".\\Log", LogFileEx :: DAY);//一天生成一个日志文件
//注意日志所属目录创建失败会自动退出, 请注意目录的合法性, 文件生成频率看情况掌握
//24小时运行的程序可以每天生成一个日志文件, 以免内容过多
 */ 
 
#ifndef _LOGFILE_H
 #define  _LOGFILE_H 
 
#include  < assert.h > 
#include  < time.h > 
#include  < stdio.h > 
#include  < windows.h > 
 
 class  LogFile
 {
 protected :

 CRITICAL_SECTION _csLock;
  char   *  _szFileName;
 HANDLE _hFile;

  bool  OpenFile() // 打开文件, 指针到文件尾 
   {
   if (IsOpen())
    return   true ;

   if ( ! _szFileName)
    return   false ;

  _hFile  =   CreateFile(
   _szFileName, 
   GENERIC_WRITE,
   FILE_SHARE_READ  |  FILE_SHARE_WRITE,
   NULL,
   OPEN_EXISTING,
   FILE_ATTRIBUTE_NORMAL,
   NULL 
  );

   if ( ! IsOpen()  &&  GetLastError()  ==   2 ) // 打开不成功, 且因为文件不存在, 创建文件 
    _hFile  =   CreateFile(
    _szFileName, 
    GENERIC_WRITE,
    FILE_SHARE_READ  |  FILE_SHARE_WRITE,
    NULL,
    OPEN_ALWAYS,
    FILE_ATTRIBUTE_NORMAL,
    NULL 
   );  

   if (IsOpen())
   SetFilePointer(_hFile,  0 , NULL, FILE_END);

   return  IsOpen();
 } 
 
 DWORD Write(LPCVOID lpBuffer, DWORD dwLength)
  {
  DWORD dwWriteLength  =   0 ;

   if (IsOpen())
   WriteFile(_hFile, lpBuffer, dwLength,  & dwWriteLength, NULL);

   return  dwWriteLength;
 } 
 
  virtual   void  WriteLog( LPCVOID lpBuffer, DWORD dwLength) // 写日志, 可以扩展修改 
   {
  time_t now;
   char  temp[ 21 ];
  DWORD dwWriteLength;

   if (IsOpen())
   {
   time( & now);
   strftime(temp,  20 ,  " %Y-%m-%d %H:%M:%S " , localtime( & now));

   WriteFile(_hFile,  " \xd\xa#----------------------------- " ,  32 ,  & dwWriteLength, NULL);
   WriteFile(_hFile, temp,  19 ,  & dwWriteLength, NULL);
   WriteFile(_hFile,  " -----------------------------#\xd\xa " ,  32 ,  & dwWriteLength, NULL);
   WriteFile(_hFile, lpBuffer, dwLength,  & dwWriteLength, NULL);
   WriteFile(_hFile,  " \xd\xa " ,  2 ,  & dwWriteLength, NULL);
   
   FlushFileBuffers(_hFile);

  } 
 } 
 
   void  Lock()   { ::EnterCriticalSection( & _csLock); } 
   void  Unlock()  { ::LeaveCriticalSection( & _csLock); } 
 
 public :
  
 LogFile( const   char   * szFileName  =   " Log.log " ) // 设定日志文件名 
   {
  _szFileName  =  NULL;
  _hFile  =  INVALID_HANDLE_VALUE;
  ::InitializeCriticalSection( & _csLock);

  SetFileName(szFileName);
 } 
 
  virtual   ~ LogFile()
  {
  ::DeleteCriticalSection( & _csLock);
  Close();

   if (_szFileName)
   delete []_szFileName;
 } 
 
  const   char   *  GetFileName()
  {
   return  _szFileName;
 } 
 
  void  SetFileName( const   char   * szName) // 修改文件名, 同时关闭上一个日志文件 
   {
  assert(szName);

   if (_szFileName)
   delete []_szFileName;

  Close();

  _szFileName  =   new   char [strlen(szName)  +   1 ];
  assert(_szFileName);
  strcpy(_szFileName, szName);
 } 
 
  bool  IsOpen()
  {
   return  _hFile  !=  INVALID_HANDLE_VALUE;
 } 
 
  void  Close()
  {
   if (IsOpen())
   {
   CloseHandle(_hFile);
   _hFile  =  INVALID_HANDLE_VALUE;
  } 
 } 
 
  void  Log(LPCVOID lpBuffer, DWORD dwLength) // 追加日志内容 
   {
  assert(lpBuffer);
  __try
   {
   Lock();

    if ( ! OpenFile())
     return ;

   WriteLog(lpBuffer, dwLength);
  } 
  __finally
   {
   Unlock();
  }  
 } 
 
  void  Log( const   char   * szText)
  {
  Log(szText, strlen(szText));
 } 
 
 private : // 屏蔽函数 
 
 LogFile( const  LogFile & );
 LogFile & operator   =  ( const  LogFile & );
} ;

 class  LogFileEx :  public  LogFile
 {
 protected :

  char   * _szPath;
  char  _szLastDate[ 9 ];
  int  _iType;

  void  SetPath( const   char   * szPath)
  {
  assert(szPath);

  WIN32_FIND_DATA wfd;
   char  temp[MAX_PATH  +   1 ]  =   { 0 } ;

   if (FindFirstFile(szPath,  & wfd)  ==  INVALID_HANDLE_VALUE  &&  CreateDirectory(szPath, NULL)  ==   0 )
   {
   strcat(strcpy(temp, szPath),  "  Create Fail. Exit Now! Error ID : " );
   ltoa(GetLastError(), temp  +  strlen(temp),  10 );
   MessageBox(NULL, temp,  " Class LogFileEx " , MB_OK);
   exit( 1 );
  } 
   else 
    {
   GetFullPathName(szPath, MAX_PATH, temp, NULL);
   _szPath  =   new   char [strlen(temp)  +   1 ];
   assert(_szPath);
   strcpy(_szPath, temp);
  } 
 } 
 
 public :

  enum  LOG_TYPE {YEAR  =   0 , MONTH  =   1 , DAY  =   2 } ;

 LogFileEx( const   char   * szPath  =   " . " , LOG_TYPE iType  =  MONTH)
  {
  _szPath  =  NULL;
  SetPath(szPath);
  _iType  =  iType;
  memset(_szLastDate,  0 ,  9 );
 } 
 
  ~ LogFileEx()
  {
   if (_szPath)
   delete []_szPath;
 } 
 
  const   char   *  GetPath()
  {
   return  _szPath;
 } 
 
  void  Log(LPCVOID lpBuffer, DWORD dwLength)
  {
  assert(lpBuffer);

   char  temp[ 10 ];
   static   const   char  format[ 3 ][ 10 ]  =   { " %Y " ,  " %Y-%m " ,  " %Y%m%d " } ;
  
  __try
   {
   Lock();
   
   time_t now  =  time(NULL);

   strftime(temp,  9 , format[_iType], localtime( & now));

    if (strcmp(_szLastDate, temp)  !=   0 ) // 更换文件名 
     {
    strcat(strcpy(_szFileName, _szPath),  " \\ " );
    strcat(strcat(_szFileName, temp),  " .log " );
    strcpy(_szLastDate, temp);
    Close();
   } 
 
    if ( ! OpenFile())
     return ;
   
   WriteLog(lpBuffer, dwLength);
  } 
  __finally
   {
   Unlock();
  } 
 } 
 
  void  Log( const   char   * szText)
  {
  Log(szText, strlen(szText));
 } 
 
 private : // 屏蔽函数 
 
 LogFileEx( const  LogFileEx & );
 LogFileEx & operator   =  ( const  LogFileEx & );

} ;

 #endif 

时间: 2024-10-01 07:37:25

撰写日志类的相关文章

C# 日志类

本文代码来自:http://www.oschina.net/code/snippet_1181744_27513 作者:ebola 该类的作用:简单日志类,队列实现.可按天 周 月 年 大小分割文件. 代码如下: using System; using System.Collections.Generic; using System.Globalization; using System.IO; using System.Linq; using System.Text; using System

来自mooon的最简单的日志类CSimpleLogger

/** * 单个头文件,可即时独立使用,只要定义了宏NOT_WITH_MOOON,即不依赖于mooon * 简单的写日志类,非线程安全,提供按大小滚动功能 * 不追求功能,也不追求性能,只求简单,若要功能强.性能高,可以使用CLogger * * 使用方法: * 1) 构造一个CSimpleLogger对象 * CSimpleLogger logger(".", "test.log", 1024*1024, 10); * 2) 调用print方法写日志 * logg

改进后的日志类CLogger

在原有的基础上增加了module_name,表示模块名,当一个系统由多模块组成时,输出的日志将更加清晰,使用方法,以MOOON-agent中的为例: /** 不要修改下面的常量值,而应当通过对应的方法去修改 * 这些常量值主要是方便多模块共享,故放在这个公有头文件当中 */enum{ LOG_LINE_SIZE_MIN = 256, /** 日志行最小长度 */ LOG_LINE_SIZE_MAX = 32768, /** 日志行最大长度(32K) ,最大不能超过64K,因为使用2字节无符号整数

ASP日志类和判断是否包涵JS脚本类

ASP日志类  代码如下 复制代码 Function WriteLogReg(Error_lerong)     On Error Resume Next     LogFileTmp = "Error.log"     Set tmpFsoR = Server.CreateObject("scripting.filesystemobject")     Set tmpLogR = tmpFsoR.OpentextFile(Server.MapPath(LogFil

C# 简易异步日志类 [ C# | Log | TextWriterTraceListener ]

前言 即使是小型项目,也需要日志的功能,这里就不讨论Log4Net之类的框架,提供一个异步的.控制台输出+日志文件输出的简易日志帮助类.   正文 一.帮助类文件Logger.cs //=========================================//// 作 者:农民伯伯// 邮 箱:over140@gmail.com// 博 客:http://over140.cnblogs.com/// 时 间:2009-7-16// 描 述:日志类,注意需要在日志记录的目录给用户写入权

一个简单php日志类

日志类如下,news目录为当前php文档根目录下子目录. <?phpif( ! defined('BASEPATH') ) {    define ('BASEPATH', $_SERVER['DOCUMENT_ROOT'].'/news/');}require_once BASEPATH.'config/config.inc.php';require_once BASEPATH.'config/constants.php';define ("LOG_PATH", $config

自己写的简易版Java日志类分享_java

/** * */ import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; /** * @author magic282 * */ public class Logger { private static String logFilePath; private static boolean

C++语言编写写日志类_C 语言

使用C++语言编写写日志类,支持写日志级别设置.支持多线程.支持可变形参表写日志. 主要提供以下接口: 1.设置写日志的级别 2.写关键日志信息 3.写错误日志信息 4.写警告日志信息 5.写一般日志信息 #ifndef COMMAND_DEFINE_H #define COMMAND_DEFINE_H //日志级别的提示信息 static const char * KEYINFOPREFIX = " Key: \n"; static const char * ERRORPREFIX

【等待事件】等待事件系列(3+4)--System IO(控制文件)+日志类等待

 [等待事件]等待事件系列(3+4)--System IO(控制文件)+日志类等待   1  BLOG文档结构图     2  前言部分   2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① 控制文件类等待 ② 日志类等待   2.2  相关参考文章链接 [推荐] 等待事件系列(1)--User I/O类型(下) http://blog.itpub.net/26736162/viewspace-2124435