最近写了个日志类,挺好用:)

原创 2006年06月21日 12:04:00

最近写了一个日志类Clog,在实际系统中应用检验过了,效果不错,贴出来和大家交流交流,看还有没有需要改进的地方。

现对Clog类做部分说明:

这个类用到MFC的CFileFind,如果不用MFC,CFileFind实现的查找文件夹功能可用PathFileExists实现,当然,CString类型也需要转换。我已对写日志函数加锁,因此是线程安全的。

程序在当前目录下生成日志文件夹(如果该文件夹存在,则不生成),每天的日志放在一个以当天日期命名的文件夹中。

MAX_ROW       定义一个日志文件的最大行数,一个日志文件达到这个行数后即关闭,并创建一个新文件。

void Disable();  关闭日志功能

 void Enable();  打开日志功能


 int NewLogFile();  创建新日志文件


 BOOL IsChangeDay();  判断是否跨天(凌晨0点)


 CString GetCurntTime();  获得当前时间字符串,格式为 2006-06-21-11-50

 void WriteLogFile(const char* fmt, ... );  写日志函数

 

头文件  LogFile.h

 

#include <sys/stat.h>
#include <fcntl.h>
#include <io.h>
#include <afxmt.h>

#define MAX_ROW 5000

class CLog
{
public:
 void Disable();
 void Enable();
 CLog();
 ~CLog();
 void WriteLogFile(const char* fmt, ... );
protected:
 int NewLogFile();
 BOOL IsChangeDay();
 CString GetCurntTime();
private:
 int m_filehandle;
 int m_row;
 int m_dirnum;
 int m_filenum;
 BOOL m_needlog;
 char m_sContent[1024*1024];
 CString m_strContent;

 CString m_sCurtTime;
 CString m_sYestady;
 CString m_sToday;
 CString m_sCurtDir;
 CString m_sLogDir;
 CString m_sLogDayDir;

 CCriticalSection m_cs;
};

 

实现代码  LogFile.cpp


#include "stdafx.h"
#include "LogFile.h"

#include <direct.h>

static char  log_directory[]="ivr_log";

CLog::CLog()
{
 m_row = 0;
 m_filehandle = 0;
 m_dirnum = 0;
 m_filenum = 0;
 m_sCurtTime = _T("");
 m_sToday = _T("");
 m_sYestady = _T("");
 m_sCurtDir = _T("");
 m_sLogDir = _T("");
 m_needlog = FALSE;

 GetCurrentDirectory(_MAX_PATH,m_sCurtDir.GetBuffer(_MAX_PATH));
 m_sCurtDir.ReleaseBuffer();

 CString sDirName;
 CFileFind f;
 BOOL bHasLogDir = FALSE;
 BOOL bFind = f.FindFile(m_sCurtDir + "//*.*");

 while (bFind)
 {
  bFind = f.FindNextFile();
  if (f.IsDots()) continue;
  if (f.IsDirectory())
  {
   sDirName = f.GetFileName();
   sDirName.MakeLower();
   if (sDirName == (CString)log_directory)
   {
    bHasLogDir = TRUE;
    break;
   }
  }
 }
 m_sLogDir = m_sCurtDir + (CString)"//" + (CString)log_directory;
 if (!bHasLogDir)
 {
  _mkdir(m_sLogDir);
 }

 CString strTime = GetCurntTime ();

 m_sToday = strTime.Mid(0,10);
}

CLog::~CLog()
{
 _close(m_filehandle);
}

int CLog::NewLogFile()
{
 CString strLogfileName;

 if (m_filenum > 0)
 {
  _close(m_filehandle);
 }
 strLogfileName = m_sLogDayDir + (CString)"//" + m_sCurtTime + (CString)".txt";
 if((m_filehandle=_open(strLogfileName,_O_WRONLY| _O_CREAT|O_TRUNC, _S_IREAD | _S_IWRITE)) == -1)
 {
  printf("cannot create log file:%s/n",strLogfileName);
  return -1;
 }
 m_filenum++;
 return 0;
}

BOOL CLog::IsChangeDay()
{
 m_sCurtTime  = GetCurntTime();
 m_sToday = m_sCurtTime.Mid(0,10);
 
 if (m_sToday != m_sYestady)
 {
  m_sYestady = m_sToday;
  m_sLogDayDir = m_sLogDir + (CString)"//" + m_sToday;
  _mkdir(m_sLogDayDir);
  return TRUE;
 }
 return FALSE;
}

void CLog::WriteLogFile(const char* fmt, ... )
{
 if (m_needlog)
 {
  m_cs.Lock();

  if (m_row >= MAX_ROW ||  IsChangeDay())
  {
   if (NewLogFile() == -1)
   {
    m_cs.Unlock();
    return;
   }
   m_row = 0;
  }
 
  va_list v_args;
  va_start(v_args,fmt);
  vsprintf( m_sContent, fmt, v_args );
  va_end( v_args );
 
  CString strTime;
  CTime cTime = CTime::GetCurrentTime();
  strTime = _T("20") + cTime.Format("%y-%m-%d %H:%M:%S");
/*
  char sTime[32];
  time_t now = time(NULL);
  tm *tm_time = localtime(&now);    //注意,localtime非线程安全
  strftime(sTime,sizeof(sTime),"20%y-%m-%d %H:%M:%S",tm_time);
*/
  m_strContent = (CString)"[" + strTime + (CString)"]" + (CString)m_sContent + "/n";

  _write(m_filehandle,m_strContent,m_strContent.GetLength());
  m_row++;

  m_cs.Unlock();
 }
}

CString CLog::GetCurntTime()
{
 CString strTime;

 CTime cTime = CTime::GetCurrentTime();
 strTime = _T("20") + cTime.Format("%y-%m-%d-%H-%M-%S");

 return strTime;
}

void CLog::Enable()
{
 m_needlog = TRUE;
}

void CLog::Disable()
{
 m_needlog = FALSE;
}

 

 

PHP 文件操作类(创建文件并写入) 生成日志

  • homevip
  • homevip
  • 2014年06月01日 22:14
  • 1949

【异常处理】捕获日志类的用法

由于在公司我和另外一名同事负责系统后台代码的编写,对于线程异常的处理比较重视,之前的异常处理方法基本上就是print出错误信息,打印到堆栈,或者在catch中处理,或者throw到上一级别,有的时候异...
  • u013047584
  • u013047584
  • 2016年08月24日 23:34
  • 1095

C++实现一个简洁而又强大的日志记录类

代码执行时记录日志是很有必要的,尤其在涉及到多进程、多线程调试或者是调试服务程序时。本分分享一个最近写的简单的日志类,希望有所帮助。不喜欢废话,上代码了: 头文件如下: #pragma once #i...
  • mfcing
  • mfcing
  • 2014年12月18日 15:46
  • 6522

Delphi 日志输出记录类

{ ******************************************************* } { 单元名:  UntTIO.pas } { 创建日期:2006-1-14 23...
  • warrially
  • warrially
  • 2013年09月12日 11:19
  • 3239

简易Java日志(Log)输出工具的封装

平时 Java 项目的开发通常需要统一管理日志(Log)的输出,例如控制日志信息输送的目的地(控制台、文件等),控制每一条日志的输出格式,把日志分为不同的级别等。常用的比较成熟的 Java 日志管理工...
  • xietansheng
  • xietansheng
  • 2017年04月22日 23:22
  • 2445

关于使用C#编写一个简单的日志类

最近在项目中编写的log类,在博客上记录一下。 在调用的时候会按照当前时间自动生成对应的日志文件。代码如下: using System; using System.Collections.Gene...
  • carlblack1987
  • carlblack1987
  • 2017年03月24日 16:32
  • 239

一个日志工具类

一个日志工具类 L.java这是一个日志工具类,挺好用的!分享出来,支持一下功能 输出各种级别的log日志:v、d、i、e L.v(“msg”)不带tag的日志输出,并且可以打印出当前所处的文件、...
  • watermusicyes
  • watermusicyes
  • 2015年12月28日 10:47
  • 2331

自定义Android日志输出工具类

/*** *----------- 版本说明--------------- * 1.0.0实现的功能: * a、根据配置文件,控制了是否需要打印各种调试日志的信息; * b、该工具的使用是全局...
  • CDersTeam
  • CDersTeam
  • 2016年01月03日 15:13
  • 700

php记录自定义log日志方法

php记录log日志方法:/** * 记录错误日志 * @param 日志内容 $res */ function save_log($res) { $err_date = date("...
  • u013372487
  • u013372487
  • 2016年06月12日 10:55
  • 3063

自己写的C++日志类log

主要功能是在服务器运行的时候可以打印日志到日志文件中,主要运用到的知识点有线程, 线程锁,条件变量,STL的deque。大致思路是这样的:             这个类提供一个接口,可以直接调用他...
  • u012314708
  • u012314708
  • 2016年08月05日 17:12
  • 3076
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:最近写了个日志类,挺好用:)
举报原因:
原因补充:

(最多只允许输入30个字)