g_pLog = new CLog("log");
 g_pLog->Enable();
 g_pScrLog = new CLog("data");
 g_pScrLog->Enable();
 CString srelog= _T("log...");
 g_pLog->WriteLogFile(srelog);
#include <sys/stat.h>
#include <fcntl.h>
#include <io.h>
#include <afxmt.h>
#define MAX_ROW 5000
/**********************************************************************************
程序在当前目录下生成日志文件夹(如果该文件夹存在,则不生成),
每天的日志放在一个以当天日期命名的文件夹中。
MAX_ROW       定义一个日志文件的最大行数,一个日志文件达到这个行数后即关闭,并创建一个新文件。
**********************************************************************************/
class CLog
{
public:
 CLog(char* directory);
 ~CLog();
public:
 void Disable();   // 关闭日志功能
 void Enable();   // 打开日志功能
 void WriteLogFile(const char* fmt, ... );// 写日志函数
 void DeleteLogFile();
protected:
 int NewLogFile();  // 创建新日志文件
 BOOL IsChangeDay();  // 判断是否跨天(凌晨0点)
 CString GetCurntTime(); // 获得当前时间字符串,格式为 200709061150
 BOOL DelTree(LPCTSTR lpszPath);
private:
 int m_filehandle;
 int m_row;
 int m_dirnum;
 int m_filenum;
 BOOL m_needlog;
 char m_sContent[*];
 CString m_strContent;
 CString m_sCurtTime;
 CString m_sYestady;
 CString m_sToday;
 CString m_sCurtDir;
 CString m_sLogDir;
 CString m_sLogDayDir;
 CCriticalSection m_cs;
};
extern CLog *g_pLog;
extern CLog *g_pScrLog;
#include "stdafx.h"
#include "Log.h" #include <direct.h> CLog *g_pLog; // 日志类指针
CLog *g_pScrLog; // 设备原始数据记录指针 /* ==============
创建日志文件 参数:
directory 目录名称
返回值:

*///=============
CLog::CLog(char* directory)
{
m_row = ;
m_filehandle = ;
m_dirnum = ;
m_filenum = ;
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)directory)
{
bHasLogDir = TRUE;
break;
}
}
} m_sLogDir = m_sCurtDir + (CString)"\\" + (CString)directory; if (!bHasLogDir)
{
_mkdir(m_sLogDir);
} CString strTime = GetCurntTime (); m_sToday = strTime.Mid(,);
} CLog::~CLog()
{
if(m_filehandle != )
_close(m_filehandle);
} /* ==============
创建日志文件 参数:

返回值:
0 成功.-1 失败
*///=============
int CLog::NewLogFile()
{
CString strLogfileName; if (m_filenum > )
{
_close(m_filehandle);
} strLogfileName = m_sLogDayDir + (CString)"\\" + m_sCurtTime + (CString)".Log"; if ((m_filehandle=_open(strLogfileName, _O_WRONLY)) == -)
{
if ((m_filehandle=_open(strLogfileName, _O_WRONLY|_O_CREAT|O_TRUNC, _S_IREAD|_S_IWRITE)) == -)
{
printf("cannot create log file:%s\n",strLogfileName);
return -;
}
} m_filenum++;
return ;
} /* ==============
判断是否跨天(凌晨0点) 参数:

返回值:
false 当天
true 跨天
*///=============
BOOL CLog::IsChangeDay()
{
m_sCurtTime = GetCurntTime();
m_sToday = m_sCurtTime.Mid(,); 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)
return; m_cs.Lock(); if (m_row >= MAX_ROW || IsChangeDay())
{
if (NewLogFile() == -)
{
m_cs.Unlock();
return;
}
m_row = ;
} 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("") + cTime.Format("%y-%m-%d %H:%M:%S"); m_strContent = (CString)"[" + strTime + (CString)"]" + (CString)m_sContent + "\n"; _write(m_filehandle, m_strContent, m_strContent.GetLength());
m_row++; m_cs.Unlock();
} /* ==============
获得当前时间字符串,格式为 20070906 参数:

返回值:
当前时间字符串
*///============= CString CLog::GetCurntTime()
{
CString strTime; CTime cTime = CTime::GetCurrentTime();
strTime = _T("") + cTime.Format("%y%m%d%H%M%S"); return strTime;
} /* ==============
打开日志功能 参数:

返回值:

*///=============
void CLog::Enable()
{
m_needlog = TRUE;
} /* ==============
关闭日志功能 参数:

返回值:

*///=============
void CLog::Disable()
{
m_needlog = FALSE;
} /* ==============
删除7天前的日志 参数:

返回值:

*///=============
void CLog::DeleteLogFile()
{
CString iFlieName,iFlieName1,iToday,TStr;
int k,k1,k2;
char s[] = {'\0'};
TStr = GetCurntTime();
iToday = TStr.Mid(,);
CFileFind ff;
BOOL bFound = ff.FindFile(m_sLogDir+"\\*", );
while(bFound)
{
bFound = ff.FindNextFile(); if (ff.IsDots())
continue; if (ff.IsDirectory())
{
// 这里是目录
iFlieName = ff.GetFilePath();
iFlieName1 = iFlieName.Right(); k = atoi(iToday)/ - atoi(iFlieName1)/;
k1 = atoi(iToday) - atoi(iFlieName1);
k2 = - (atoi(iFlieName1)%) + (atoi(iToday)%);
_tcscpy( s , iFlieName.GetBuffer(iFlieName.GetLength()) ) ;
if ((k>)&&(k<))
{
DelTree((LPCTSTR)s);
}
else if (k == )
{
if (k1 > )
{
DelTree((LPCTSTR)s);
}
}
else if (k == )
{
if (k2 > )
{
DelTree((LPCTSTR)s);
}
}
else
{
if ((atoi(iToday)/-atoi(iFlieName1)/)==)
{
if ((atoi(iFlieName1)%)/ == )
{
if (k2 > )
{
DelTree((LPCTSTR)s);
}
}
else
{
DelTree((LPCTSTR)s);
}
}
else
{
DelTree((LPCTSTR)s);
}
}
}
}
ff.Close();
} /* ==============
删除文件夹 参数:
文件夹的路径
返回值:
删除是否成功
*///=============
BOOL CLog::DelTree(LPCTSTR lpszPath)
{
SHFILEOPSTRUCT FileOp;
FileOp.fFlags = FOF_NOCONFIRMATION;
FileOp.hNameMappings = NULL;
FileOp.hwnd = NULL;
FileOp.lpszProgressTitle = NULL;
FileOp.pFrom = lpszPath;//路径名从何处来
FileOp.pTo = NULL;//
FileOp.wFunc = FO_DELETE;
return SHFileOperation(&FileOp) == ;
}

g_pLog的更多相关文章

随机推荐

  1. python+selenium一:对浏览器的常规操作

    # 1.打开Firefox浏览器 from selenium import webdriverdriver = webdriver.Firefox()driver.get("https:// ...

  2. docker harbor搭建笔记

    介绍 Harbor是VMware公司开源的一个用于存储和分发Docker镜像的企业级Registry服务器,以Docker开源的Registry为基础,通过添加一些企业必需的功能特性,例如安全.标识和 ...

  3. 品Spring:负责bean定义注册的两个“排头兵”

    别看Spring现在玩的这么花,其实它的“筹码”就两个,“容器”和“bean定义”. 只有先把bean定义注册到容器里,后续的一切可能才有可能成为可能. 所以在进阶的路上如果要想走的顺畅些,彻底搞清楚 ...

  4. Anaconda基本认识

    Anaconda Distribution是执行Python数据科学和机器学习最简单的方法. 它包括250多种流行的数据科学软件包,以及适用于Windows,Linux和MacOS的conda软件包和 ...

  5. Spring 梳理 - javaConfig在App和webApp中的应用

    package com.dxz.demo.configuration; import org.springframework.context.annotation.Configuration; @Co ...

  6. Spring MVC-从零开始-view-向页面传递data(ModelAndView与ModelMap的区别)

    1.ModelMap的用法 package com.jt; import org.springframework.stereotype.Controller; import org.springfra ...

  7. 使用freemarker做邮件发送模板

    1.解析工具类 package com.example.springbootfreemarker.utils; import freemarker.template.Configuration; im ...

  8. String 用法 简单API

    明天天梯赛选拔,怕不是STl忘到姥姥家去了,赶紧复习一下 构造str string s = "fuckyouRMA"; string s1(s, 2); de(s1); strin ...

  9. 前端深入之css篇|你真的了解“权重”吗?

    写在前面 权重这个概念,相信对许多进行过前端开发的小伙伴来说肯定并不陌生,有时候一个样式添加不上,我们就会一个 !important 怼上去,一切就好像迎刃而解了.但还有的时候,!important也 ...

  10. Android 手机端自动化测试框架

    前言: 大概有4个月没有更新了,因项目和工作原因,忙的手忙脚乱,趁十一假期好好休息一下,年龄大了身体还是扛不住啊,哈哈.这次更新Android端自动化测试框架,也想开源到github,这样有人使用才能 ...