Skip to content

Commit 3b045fb

Browse files
committed
hide some implementation of log
1 parent 9507dac commit 3b045fb

3 files changed

Lines changed: 94 additions & 132 deletions

File tree

include/zeroerr/log.h

Lines changed: 3 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -256,8 +256,6 @@ enum LogSeverity {
256256
FATAL_l, // it will contain a stack trace
257257
};
258258

259-
struct LogTime {};
260-
261259
struct LogInfo {
262260
const char* filename;
263261
const char* function;
@@ -269,24 +267,7 @@ struct LogInfo {
269267
std::map<std::string, int> names;
270268

271269
LogInfo(const char* filename, const char* function, const char* message, const char* category,
272-
unsigned line, unsigned size, LogSeverity severity)
273-
: filename(filename),
274-
function(function),
275-
message(message),
276-
category(category),
277-
line(line),
278-
size(size),
279-
severity(severity) {
280-
for (const char* p = message; *p; p++)
281-
if (*p == '{') {
282-
const char* q = p + 1;
283-
while (*q && *q != '}') q++;
284-
if (*q == '}') {
285-
names[std::string(p + 1, q)] = names.size();
286-
p = q;
287-
}
288-
}
289-
}
270+
unsigned line, unsigned size, LogSeverity severity);
290271
};
291272

292273
struct LogMessage;
@@ -323,6 +304,7 @@ struct GetTuplePtr {
323304

324305
template <typename... T>
325306
struct LogMessageImpl : LogMessage {
307+
std::tuple<T...> args;
326308
LogMessageImpl(T... args) : LogMessage(), args(args...) {}
327309

328310
std::string str() const override {
@@ -334,19 +316,9 @@ struct LogMessageImpl : LogMessage {
334316
detail::visit_at(args, info->names.at(name), f);
335317
return f.ptr;
336318
}
337-
338-
std::tuple<T...> args;
339-
};
340-
341-
342-
constexpr size_t LogStreamMaxSize = 1024 * 1024 - 16;
343-
344-
struct DataBlock {
345-
char data[LogStreamMaxSize];
346-
size_t size = 0;
347-
DataBlock* next = nullptr;
348319
};
349320

321+
struct DataBlock;
350322
class Logger {
351323
public:
352324
virtual ~Logger() = default;
@@ -390,13 +362,10 @@ class LogStream {
390362
void* getRawLog(std::string func, unsigned line, std::string name);
391363

392364
void flush();
393-
394-
void setBinFileLogger(std::string name);
395365
void setFileLogger(std::string name);
396366
void setStdoutLogger();
397367
void setStderrLogger();
398368

399-
400369
static LogStream& getDefault();
401370
FlushMode flush_mode = FLUSH_AT_ONCE;
402371
LogMode log_mode = SYNC;

src/log.cpp

Lines changed: 44 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,38 @@ static LogCustomCallback log_custom_callback = DefaultLogCallback;
1515
void setLogCustomCallback(LogCustomCallback callback) { log_custom_callback = callback; }
1616

1717

18+
LogInfo::LogInfo(const char* filename, const char* function, const char* message,
19+
const char* category, unsigned line, unsigned size, LogSeverity severity)
20+
: filename(filename),
21+
function(function),
22+
message(message),
23+
category(category),
24+
line(line),
25+
size(size),
26+
severity(severity) {
27+
for (const char* p = message; *p; p++)
28+
if (*p == '{') {
29+
const char* q = p + 1;
30+
while (*q && *q != '}') q++;
31+
if (*q == '}') {
32+
names[std::string(p + 1, q)] = names.size();
33+
p = q;
34+
}
35+
}
36+
}
37+
38+
39+
constexpr size_t LogStreamMaxSize = 1024 * 1024 - 16;
40+
41+
struct DataBlock {
42+
size_t size = 0;
43+
DataBlock* next = nullptr;
44+
char data[LogStreamMaxSize];
45+
46+
LogMessage* begin() { return (LogMessage*)data; }
47+
LogMessage* end() { return (LogMessage*)&data[size]; }
48+
};
49+
1850
LogStream::LogStream() {
1951
first = last = new DataBlock();
2052
#ifndef ZEROERR_NO_THREAD_SAFE
@@ -63,7 +95,7 @@ void LogStream::flush() {
6395
}
6496
logger->flush(last);
6597
last->size = 0;
66-
first = last;
98+
first = last;
6799
}
68100

69101
static LogMessage* moveBytes(LogMessage* p, unsigned size) {
@@ -74,53 +106,37 @@ static LogMessage* moveBytes(LogMessage* p, unsigned size) {
74106

75107
void* LogStream::getRawLog(std::string func, unsigned line, std::string name) {
76108
for (DataBlock* p = first; p; p = p->next)
77-
for (LogMessage* q = (LogMessage*)p->data; q < (LogMessage*)&p->data[p->size];
78-
q = moveBytes(q, q->info->size))
79-
if (line == q->info->line && func == q->info->function)
80-
return q->getRawLog(name);
109+
for (auto q = p->begin(); q < p->end(); q = moveBytes(q, q->info->size))
110+
if (line == q->info->line && func == q->info->function) return q->getRawLog(name);
81111
return nullptr;
82112
}
83113

84114
class FileLogger : public Logger {
85115
public:
86-
FileLogger(std::string name, bool binary = true) : binary(binary) {
87-
if (binary) {
88-
file = fopen(name.c_str(), "wb");
89-
} else {
90-
file = fopen(name.c_str(), "w");
91-
}
92-
}
116+
FileLogger(std::string name) { file = fopen(name.c_str(), "w"); }
93117
~FileLogger() {
94118
if (file) fclose(file);
95119
}
96120
void flush(DataBlock* msg) override {
97121
if (file) {
98-
if (binary) {
99-
// TODO: Design a binary format, currently, it can not work
100-
fwrite(msg->data, msg->size, 1, file);
101-
} else {
102-
for (LogMessage* p = (LogMessage*)msg->data; p < (LogMessage*)&msg->data[msg->size];
103-
p = moveBytes(p, p->info->size)) {
104-
auto ss = log_custom_callback(*p, false);
105-
fwrite(ss.c_str(), ss.size(), 1, file);
106-
}
122+
for (auto p = msg->begin(); p < msg->end(); p = moveBytes(p, p->info->size)) {
123+
auto ss = log_custom_callback(*p, false);
124+
fwrite(ss.c_str(), ss.size(), 1, file);
107125
}
108126
fflush(file);
109127
}
110128
}
111129

112130
protected:
113131
FILE* file;
114-
bool binary;
115132
};
116133

117134
class OStreamLogger : public Logger {
118135
public:
119136
OStreamLogger(std::ostream& os) : os(os) {}
120137

121138
void flush(DataBlock* msg) override {
122-
for (LogMessage* p = (LogMessage*)msg->data; p < (LogMessage*)&msg->data[msg->size];
123-
p = moveBytes(p, p->info->size)) {
139+
for (auto p = msg->begin(); p < msg->end(); p = moveBytes(p, p->info->size)) {
124140
os << log_custom_callback(*p, true);
125141
}
126142
os.flush();
@@ -136,14 +152,9 @@ LogStream& LogStream::getDefault() {
136152
return stream;
137153
}
138154

139-
void LogStream::setBinFileLogger(std::string name) {
140-
if (logger) delete logger;
141-
logger = new FileLogger(name);
142-
}
143-
144155
void LogStream::setFileLogger(std::string name) {
145156
if (logger) delete logger;
146-
logger = new FileLogger(name, false);
157+
logger = new FileLogger(name);
147158
}
148159

149160
void LogStream::setStdoutLogger() {
@@ -183,7 +194,8 @@ void setLogCategory(const char* categories) {
183194
}
184195

185196
static LogStream::FlushMode saved_flush_mode;
186-
void suspendLog() {
197+
198+
void suspendLog() {
187199
saved_flush_mode = LogStream::getDefault().flush_mode;
188200
LogStream::getDefault().flush_mode = LogStream::FLUSH_MANUALLY;
189201
}
@@ -221,6 +233,6 @@ static std::string DefaultLogCallback(const LogMessage& msg, bool colorful) {
221233
ss << std::endl;
222234
return ss.str();
223235
}
224-
236+
#undef zeroerr_color
225237

226238
} // namespace zeroerr

0 commit comments

Comments
 (0)