logger logging class unicode

logger.c

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

using namespace std;
//extern CServerInterface *ExtServer;
Logger ExtLogger;

extern string         workingDir_;
LPCWSTR String2Wstring(const string s)
{
	//wstring wszStr;//LPCWSTR wszStr;//wstring wszStr;
	int len = s.length();
	int lenbf = MultiByteToWideChar(CP_ACP, 0, s.c_str(), len, NULL, NULL);
	LPWSTR lpwszStr = new wchar_t[lenbf+1];
	MultiByteToWideChar(CP_ACP, 0, s.c_str(), -1, lpwszStr, lenbf * sizeof(wchar_t));
	lpwszStr[len] = 0;
	return lpwszStr;
}
Logger::Logger(void)
	/*:logName_("plugin_log.log")*/
{
}


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()
{

	LPCWSTR logdirs = String2Wstring(logDir_);
	CreateDirectory(logdirs, NULL);
}

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

	char tmp[max_log_buffer];
	char buffer[max_log_buffer*2];
	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,
		"%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);

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

void Logger::OutW(wchar_t *msg, ...)
{
	//---
	sync_.Lock();

	wchar_t tmp[max_log_buffer];
	wchar_t buffer[max_log_buffer*2];
	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"
#define max_log_buffer 25000
class Logger
{
private:
	Sync				sync_;
	std::fstream		file_;
	std::string			logFileName_;
	std::string         logDir_;
	//LPCWSTR				logFileName_;
	//LPCWSTR				logDir_;
	int			        logFileDate_;

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

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

extern Logger ExtLogger;

sync.h

#pragma once

class Sync
{
private:
	CRITICAL_SECTION  m_cs;
	CRITICAL_SECTION  m_cfg;
public:
	Sync()
	{
		ZeroMemory(&m_cs, sizeof(m_cs));
		InitializeCriticalSection(&m_cs);

		ZeroMemory(&m_cfg, sizeof(m_cfg));
		InitializeCriticalSection(&m_cfg);
	}
	~Sync()
	{
		DeleteCriticalSection(&m_cs);
		ZeroMemory(&m_cs, sizeof(m_cs));

		DeleteCriticalSection(&m_cfg);
		ZeroMemory(&m_cfg, sizeof(m_cfg));
	}
	inline void       Lock() { EnterCriticalSection(&m_cs); }
	inline void       Unlock() { LeaveCriticalSection(&m_cs); }

	inline void       Flg_Lock() { EnterCriticalSection(&m_cfg); }
	inline void       Flg_Unlock() { LeaveCriticalSection(&m_cfg); }
};

 

Published 64 original articles · won praise 3 · Views 4546

Guess you like

Origin blog.csdn.net/qq_37631516/article/details/104287618
Recommended