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的更多相关文章
随机推荐
- Flutter 中文文档网站 flutter.cn 正式发布!
在通常的对 Flutter 介绍中,最耳熟能详的是下面四个特点: 精美 (Beautiful):充分的赋予和发挥设计师的创造力和想象力,让你真正掌控屏幕上的每一个像素. ** 极速 (Fast)**: ...
- 04: OpenGL ES 基础教程03 纹理
前言 1:常用类: 1:纹理的作用 正文 一:常用类 上下文 顶点数据缓存 着色器 baseEffect 一:纹理 1.1: 纹理可以控制渲染的每个像素的颜色. 1.2: 纹素:与像素一样,保存每 ...
- 浅谈Task的用法
Task是用来实现多线程的类,在以前当版本中已经有了Thread及ThreadPool,为什么还要提出Task类呢,这是因为直接操作Thread及ThreadPool,向线程中传递参数,获取线程的返回 ...
- Java中的方法和方法重载
上次我们讲了Java中的一些基本的语法;今天我们就讲一点内容,来说说Java中的方法和方法重载以及需要注意的一些地方; 方法: Java的方法类似与其他语言的函数,是一段用来完成特定功能的代码片段, ...
- 使用python asyncio+aiohttp做接口测试(TODO)
线程是操作系统层面的“并行”, 协程是应用程序层面的“并行”. 协程本质上就是:提供一个环境,保存一些需要等待的任务,当这些任务可以执行(等待结束)的时候,能够执行.再等待的过程中,程序可以执行别的任 ...
- Android之SOAP协议与WebService服务器交互,解决超时的问题
网络搜索大部分不能实际解决问题.特意将解决方法写下.创建MyAndroidHttpTransport 类 , package com.example.omhandroid.lib; import or ...
- Object的wait、notify和notifyAll
Obect的wait.notify 和 notifyAll是Object提供的同步方法,也就是所有对象都生而带来的方法,估计搞java的没有不知道这几个方法的.那么他究竟是怎么使用的呢?在此处记录一下 ...
- Spring boot 梳理 - mappingJackson2JsonView
MappingJacksonJsonView已被废弃了: http://static.javadoc.io/org.springframework/spring-webmvc/4.0.1.RELEAS ...
- for for in 给已有的li绑定click事件生成新的li也有click事件
想要给已有的li元素绑定一个click事件,点击生成新的li元素,并且新的li元素也要有click事件 //不能用for循环给每个li绑定click事件 因为这样的话 后面新生成的li就没有click ...
- linux mysql中文乱码解决
测试的机器是ubuntu 12.04个别linux发行版可能略有不同. 登陆mysql查看当前字符集命令: mysql> show variable like '%char%'; +------ ...