g_pLog
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的更多相关文章
随机推荐
- charles Web界面设置
本文参考:charles Web界面设置 Web Inerface Web界面可以让您使用Web浏览器控制查询,您可以访问 http://control.charles 的Web界面,当查询运行时,您 ...
- oracle 11g 下载安装 使用记录
Oracle 11g 使用记录 1.下载oracle快捷安装版: (1)下载连接:https://pan.baidu.com/s/1ClC0hQepmTw2lSJ2ODtL7g 无提取码 (2)去 ...
- jsp 中include使用问题
如果在需要在jsp页面做页面包含时 会使用到include 指令 来进行页面包含操作 这里是页面的头部 文件名称是head.jsp <%@ page language="java&qu ...
- 词表征 2:word2vec、CBoW、Skip-Gram、Negative Sampling、Hierarchical Softmax
原文地址:https://www.jianshu.com/p/5a896955abf0 2)基于迭代的方法直接学 相较于基于SVD的方法直接捕获所有共现值的做法,基于迭代的方法一次只捕获一个窗口内的词 ...
- selenium-03-常用操作
基本介绍: Selenium工具专门为WEB应用程序编写的一个验收测试工具. Selenium的核心:browser bot,是用JavaScript编写的. Selenium工具有4种:Seleni ...
- CDH集群的时间同步--简要配置要求
每个节点执行ntpstat 和 timedatectl 都显示同步并且时间相同,那么CDH才能正常使用.每次ntp服务同步到外部授时中心都要一段时间(5~10分钟),只有当NTP server(nod ...
- linux 查看文件大小命令
1.# ls -l (k) ls -l total -rw-r----- root root Oct : catalina.--.log -rw-r----- root root Oct : cata ...
- Flask基础(15)-->模板代码的复用【宏(Macro)、继承(Block)、包含(include)】
宏 对宏(macro)的理解: 把它看作 Jinja2 中的一个函数,它会返回一个模板或者 HTML 字符串 为了避免反复地编写同样的模板代码,出现代码冗余,可以把他们写成函数以进行重用 需要在多处重 ...
- RBD 基本使用 - Storage6
块存储管理系列文章 (1)RBD 基本使用 - Storage6 (2)iSCSI 网关管理 (3)使用 librbd 将虚拟机运行在 Ceph RBD (4)RBD Mirror 容灾 Ceph 块 ...
- 夯实Java基础系列13:深入理解Java中的泛型
目录 泛型概述 一个栗子 特性 泛型的使用方式 泛型类 泛型接口 泛型通配符 泛型方法 泛型方法的基本用法 类中的泛型方法 泛型方法与可变参数 静态方法与泛型 泛型方法总结 泛型上下边界 泛型常见面试 ...