C/C++ win32 一个简单的写日志类

来源:赵克立博客 分类: C/C++ 标签:C/C++发布时间:2016-01-09 23:35:44最后更新:2018-03-31 14:37:57浏览:1613
版权声明:
本文为博主原创文章,转载请声明原文链接...谢谢。o_0。
更新时间:
2018-03-31 14:37:57
温馨提示:
学无止境,技术类文章有它的时效性,请留意文章更新时间,如发现内容有误请留言指出,防止别人"踩坑",我会及时更新文章

Log.h文件

#pragma once
#include "stdio.h"
#include "windows.h"
#include "tchar.h"
#include "shlwapi.h"
#pragma comment(lib,"shlwapi.lib")
class Log
{
public:
	static bool Write(TCHAR* logStr, TCHAR* logType = _T("log"), TCHAR * logDir = _T("log"));
	//参数如何区分目录和文件:
	//如果最后有\\肯定是目录
	//如果最后又后缀".",则肯定是文件
	//如果最后没有\\,也没有后缀'.",则认为是路径
	static bool CreateFolder(TCHAR* pszPath);
private:
	Log();
	~Log();
	static Log* InitInstance();
	//当前路径
	static TCHAR s_curPath[MAX_PATH];
	//日志目录
	static TCHAR s_logDir[MAX_PATH];
	//日志的全目录路径
	static TCHAR s_logPath[MAX_PATH];
	static Log* s_instance;
};

Log.cpp文件

#include "Log.h"
Log* Log::s_instance = NULL;
TCHAR Log::s_curPath[MAX_PATH];
TCHAR Log::s_logPath[MAX_PATH];
TCHAR Log::s_logDir[MAX_PATH];
Log * Log::InitInstance()
{
	if (s_instance == NULL) {
		s_instance = new Log();
	}
	return s_instance;
}
bool Log::Write(TCHAR * logStr, TCHAR * logType, TCHAR * logDir)
{
	_tcscpy(s_logDir, logDir);
	InitInstance();
	SYSTEMTIME time;
	GetLocalTime(&time);
	TCHAR date[128] = { 0 }, filename[128] = { 0 }, hh[50] = _T("\n");
	_stprintf(date, _T("%d-%02d-%02d %02d:%02d:%02d"), time.wYear, time.wMonth, time.wDay, time.wHour, time.wMinute, time.wSecond);
	_stprintf(filename, _T("%s\\%s_%d-%02d-%02d.log"), s_logPath, logType, time.wYear, time.wMonth, time.wDay);
	FILE* fp;
	_tfopen_s(&fp, filename, _T("a,ccs=UTF-8"));
	TCHAR newstr[1024] = { 0 };
	_stprintf(newstr, _T("%s : %s\n"), date, logStr);
	if (fp) {
		fwrite(newstr, sizeof(TCHAR), _tcslen(newstr), fp);
		fclose(fp);
		return true;
	}
	else {
		return false;
	}
}
bool Log::CreateFolder(TCHAR* pszPath)
{
	//如果后面有\\则是路径,如果没有,但有后缀,则是文件,无后缀则也是路径
	TCHAR szPath[_MAX_PATH] = { 0 };
	_tcsncpy(szPath, pszPath, _MAX_PATH);
	szPath[_MAX_PATH - 1] = 0;
	TCHAR* pdot = _tcsrchr(szPath, _T('.'));
	TCHAR* psp = _tcsrchr(szPath, _T('\\'));
	if (psp && pdot && pdot > psp)
	{
		//在路径最后找到上面两个字符证明是文件,去掉文件名
		psp[0] = 0;
	}
	else
	{
		//缺省是个目录,这个地方可能吧没有后缀的文件当作目录,这里不做处理,默认当成目录
	}
	PathAddBackslash(szPath);
	if (PathIsDirectory(szPath))
		return true;
	psp = _tcschr(szPath, _T('\\'));
	while (psp)
	{
		*psp = 0;
		if (!PathIsDirectory(szPath))
		{
			if (!CreateDirectory(szPath, 0))
				return false;
		}
		*psp = _T('\\');
		psp = _tcschr(psp + 1, _T('\\'));
	}
	return true;
};
Log::Log()
{
	//取当前执行模块的全路径,如果此模块是被其它程序调用的,返回的路径还是这个程序的路径
	::GetModuleFileName(NULL, s_curPath, MAX_PATH);
	//从路径中移除文件名
	PathRemoveFileSpec(s_curPath);
	_stprintf(s_logPath, _T("%s\\%s"), s_curPath, s_logDir);
	if (!CreateFolder(s_logPath)) {
		MessageBox(NULL, _T("日志目录创建失败"), NULL, 0);
	}
}
Log::~Log()
{
}

使用方法

Log::Write(_T("新字符串"));
Log::Write(_T("debug"), _T("debug"));

image.png


微信号:kelicom QQ群:215861553 紧急求助须知
Win32/PHP/JS/Android/Python