常用功能函数 logger 日志类 mutibyte

logger.cpp

#include "stdafx.h"
#include <cstdio>
#include "logger.h"

using namespace std;

Logger ExtLogger;

extern string         workingDir_;

Logger::Logger(void)
{
}


Logger::~Logger(void)
{
	sync_.Lock();

	if (file_.is_open())
	{
		file_.flush();
		file_.close();
	}

	sync_.Unlock();
}


void Logger::Initialize()
{
	SYSTEMTIME st = {0};
	GetLocalTime(&st);
	char filename[32] = {0};
	string tmp;

	sync_.Lock();

	logDir_ = workingDir_ + "logs";
	CreateLogDir();

	logFileDate_ = st.wDay;
	sprintf_s(filename, 32, "%04d%02d%02d.log", st.wYear, st.wMonth, st.wDay);
	tmp = filename;
	logFileName_ = logDir_ + "\\" + tmp;

	//--- check file
	if (file_.is_open())
	{
		file_.close();
	}
	file_.open(logFileName_, fstream::out | fstream::app | fstream::ate);

	sync_.Unlock();
}

void Logger::CreateLogDir()
{
	// Create working directory
	CreateDirectory(logDir_.data(), NULL);
}

void Logger::Out(char *msg, ...)
{
	//---
	sync_.Lock();

	char tmp[RECV_BUF_LEN + 1024];
	char buffer[RECV_BUF_LEN + 2048];
	SYSTEMTIME st;

	char filename[32] = { 0 };
	string temp;

	if (msg == NULL)
	{
		sync_.Unlock();
		return;
	}
	va_list arg_ptr;

	//--- take current time
	GetLocalTime(&st);

	//new a log file if today is not yestoday
	if (logFileDate_ != st.wDay)
	{
		if (file_.is_open())
		{
			file_.flush();
			file_.close();
		}

		logFileDate_ = st.wDay;

		sprintf_s(filename, 32, "%04d%02d%02d.log", st.wYear, st.wMonth, st.wDay);
		temp = filename;
		logFileName_ = logDir_ + "\\" + temp;

		if (file_.is_open())
		{
			file_.close();
		}
		file_.open(logFileName_, fstream::out | fstream::app | fstream::ate);
	}

	va_start(arg_ptr, msg);
	_vsnprintf_s(tmp, sizeof(tmp) - 1, msg, arg_ptr);
	va_end(arg_ptr);
	
	sprintf_s(buffer, sizeof(buffer) - 1,
		"%04d.%02d.%02d %02d:%02d:%02d.%03d\t\t%s\n",
		st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds, tmp);

	//--- write into log
	if (file_.is_open())
	{
		file_ << buffer;
		file_.flush();
	}
	//---
	sync_.Unlock();
}

//void Logger::OutW(wchar_t *msg, ...)
//{
//	//---
//	sync_.Lock();
//
//	wchar_t tmp[1024];
//	wchar_t buffer[2048];
//	SYSTEMTIME st;
//
//	char filename[32] = { 0 };
//	string temp;
//
//	if (msg == NULL)
//	{
//		sync_.Unlock();
//		return;
//	}
//	va_list arg_ptr;
//
//	//--- take current time
//	GetLocalTime(&st);
//
//	//new a log file if today is not yestoday
//	if (logFileDate_ != st.wDay)
//	{
//		if (file_.is_open())
//		{
//			file_.flush();
//			file_.close();
//		}
//
//		logFileDate_ = st.wDay;
//
//		sprintf_s(filename, 32, "%04d%02d%02d.log", st.wYear, st.wMonth, st.wDay);
//		temp = filename;
//		logFileName_ = logDir_ + "\\" + temp;
//
//		if (file_.is_open())
//		{
//			file_.close();
//		}
//		file_.open(logFileName_, fstream::out | fstream::app | fstream::ate);
//	}
//
//	va_start(arg_ptr, msg);
//	//_vsnprintf_s(tmp, sizeof(tmp) - 1, msg, arg_ptr);
//	_vsnwprintf_s(tmp, sizeof(tmp) - 1, msg, arg_ptr);
//	va_end(arg_ptr);
//	/*sprintf_s(buffer, sizeof(buffer) - 1,
//	"%d\t%04d.%02d.%02d %02d:%02d:%02d.%03d\t%s\t%s\n",
//	code & 3, st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds, moduleName_.c_str(), tmp);*/
//	/*sprintf_s(buffer, sizeof(buffer) - 1,
//		"%04d.%02d.%02d %02d:%02d:%02d.%03d\t\t%s\n",
//		st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds, tmp);*/
//	
//	swprintf_s(buffer, sizeof(buffer) - 1,
//		L"%04d.%02d.%02d %02d:%02d:%02d.%03d\t\t%s\n",
//		st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds, tmp);
//
//	char c[2048] = {0};
//	int len = WideCharToMultiByte(CP_ACP, 0, buffer, wcslen(buffer), NULL, 0, NULL, NULL);
//	char *m_char = new char[len + 1];
//	WideCharToMultiByte(CP_ACP, 0, buffer, wcslen(buffer), m_char, len, NULL, NULL);
//	m_char[len] = '\0';
//
//	for (int i = 0; i < len; i++)
//	{
//		c[i] = m_char[i];
//	}
//
//	delete m_char;
//
//	//--- write into log
//	if (file_.is_open())
//	{
//		file_ << c;
//		file_.flush();
//	}
//	//---
//	sync_.Unlock();
//}

logger.h

#pragma once
#include <fstream>
#include <string>
#include "sync.h"

class Logger
{
private:
	Sync				sync_;

	std::fstream		file_;
	std::string			logFileName_;
	std::string         logDir_;
	int			        logFileDate_;

public:
	Logger(void);
	~Logger(void);

	void              Initialize();
	void              Out(char *msg, ...);
	void			  OutW(wchar_t *msg, ...);
	void	          CreateLogDir();
};

extern Logger ExtLogger;

发布了64 篇原创文章 · 获赞 3 · 访问量 4565

猜你喜欢

转载自blog.csdn.net/qq_37631516/article/details/104286507