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;