-
Notifications
You must be signed in to change notification settings - Fork 0
/
cpp_log.hpp
145 lines (115 loc) · 2.04 KB
/
cpp_log.hpp
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#ifndef CPP_LOG2
#define CPP_LOG2
#include <sstream>
#include <iostream>
#include <ctime>
#include <string>
#include <mutex>
/* TODO symbol log is already defined in mathcalls.h. */
namespace clog {
std::mutex m;
struct logger2 {
std::stringstream ss;
const char *level;
std::string now()
{
time_t t = time(NULL);
struct tm *tm_info;
tm_info = localtime(&t);
char buf[20];
strftime(buf, 20, "%F %T", tm_info);
return std::string(buf);
}
logger2(const char *llevel)
{
level = llevel;
}
void flush(std::ostream &out)
{
m.lock();
out << level << ": " << now() << " "
<< ss.str() << std::endl;
m.unlock();
}
virtual ~logger2()
{
}
template <typename t>
logger2& operator<<(const t s)
{
ss << s;
return *this;
}
};
/* TODO Copy and pasted code. */
struct err : public logger2 {
#ifdef CPP_LOG_ERR_FILE
std::ofstream ofs;
#endif
err() : logger2("Error") {
#ifdef CPP_LOG_ERR_FILE
ofs.open(CPP_LOG_ERR_FILE,
std::ios_base::app | std::ios_base::out);
#endif
};
~err() {
#ifdef CPP_LOG_ERR_COUT
flush(std::cout);
#endif
#ifdef CPP_LOG_ERR_CERR
flush(std::cerr);
#endif
#ifdef CPP_LOG_ERR_FILE
flush(ofs);
ofs.close();
#endif
}
};
struct warn : public logger2 {
#ifdef CPP_LOG_WARN_FILE
std::ofstream ofs;
#endif
warn() : logger2("Warning") {
#ifdef CPP_LOG_WARN_FILE
ofs.open(CPP_LOG_WARN_FILE,
std::ios_base::app | std::ios_base::out);
#endif
};
~warn() {
#ifdef CPP_LOG_WARN_COUT
flush(std::cout);
#endif
#ifdef CPP_LOG_WARN_CERR
flush(std::cerr);
#endif
#ifdef CPP_LOG_WARN_FILE
flush(ofs);
ofs.close();
#endif
}
};
struct info : public logger2 {
#ifdef CPP_LOG_INFO_FILE
std::ofstream ofs;
#endif
info() : logger2("Info") {
#ifdef CPP_LOG_INFO_FILE
ofs.open(CPP_LOG_INFO_FILE,
std::ios_base::app | std::ios_base::out);
#endif
};
~info() {
#ifdef CPP_LOG_INFO_COUT
flush(std::cout);
#endif
#ifdef CPP_LOG_INFO_CERR
flush(std::cerr);
#endif
#ifdef CPP_LOG_INFO_FILE
flush(ofs);
ofs.close();
#endif
}
};
}
#endif