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); }
};