-
Notifications
You must be signed in to change notification settings - Fork 16
/
logger.cpp
98 lines (86 loc) · 2.46 KB
/
logger.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <cassert>
#include <chrono>
#include <ctime>
#include <iostream>
#include <iomanip>
#include <map>
#include <regex>
#include "logger.h"
using namespace std;
using namespace logger;
ConsoleLogger logger::debug;
FileLogger logger::record("build_at_" __DATE__ "_" __TIME__ ".log");
#ifdef WIN32
#define localtime_r(_Time, _Tm) localtime_s(_Tm, _Time)
#endif
static const map<Level, const char *> LevelStr =
{
{ Level::Debug, "Debug" },
{ Level::Info, "Info" },
{ Level::Warning, "Warning" },
{ Level::Error, "Error" },
{ Level::Fatal, "Fatal" },
};
ostream& operator<< (ostream& stream, const tm* tm)
{
return stream << 1900 + tm->tm_year << '-'
<< setfill('0') << setw(2) << tm->tm_mon + 1 << '-'
<< setfill('0') << setw(2) << tm->tm_mday << ' '
<< setfill('0') << setw(2) << tm->tm_hour << ':'
<< setfill('0') << setw(2) << tm->tm_min << ':'
<< setfill('0') << setw(2) << tm->tm_sec;
}
BaseLogger::LogStream BaseLogger::operator()(Level nLevel)
{
return LogStream(*this, nLevel);
}
const tm* BaseLogger::getLocalTime()
{
auto now = chrono::system_clock::now();
auto in_time_t = chrono::system_clock::to_time_t(now);
localtime_r(&in_time_t, &_localTime);
return &_localTime;
}
void BaseLogger::endline(Level nLevel, string&& oMessage)
{
_lock.lock();
output(getLocalTime(), LevelStr.find(nLevel)->second, oMessage.c_str());
_lock.unlock();
}
void ConsoleLogger::output(const tm *p_tm,
const char *str_level,
const char *str_message)
{
cout << '[' << p_tm << ']'
<< '[' << str_level << "]"
<< "\t" << str_message << endl;
cout.flush();
}
FileLogger::FileLogger(string filename) noexcept
: BaseLogger()
{
string valid_filename(filename.size(), '\0');
regex express("/|:| |>|<|\"|\\*|\\?|\\|");
regex_replace(valid_filename.begin(),
filename.begin(),
filename.end(),
express,
"_");
_file.open(valid_filename,
fstream::out | fstream::app | fstream::ate);
assert(!_file.fail());
}
FileLogger::~FileLogger()
{
_file.flush();
_file.close();
}
void FileLogger::output(const tm *p_tm,
const char *str_level,
const char *str_message)
{
_file << '[' << p_tm << ']'
<< '[' << str_level << "]"
<< "\t" << str_message << endl;
_file.flush();
}