-
Notifications
You must be signed in to change notification settings - Fork 3.8k
/
log.h
103 lines (90 loc) · 2.47 KB
/
log.h
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
#ifndef LIGHTGBM_UTILS_LOG_H_
#define LIGHTGBM_UTILS_LOG_H_
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstdarg>
#include <cstring>
#include <exception>
#include <stdexcept>
namespace LightGBM {
#if defined(_MSC_VER)
#define THREAD_LOCAL __declspec(thread)
#else
#define THREAD_LOCAL thread_local
#endif
#ifndef CHECK
#define CHECK(condition) \
if (!(condition)) Log::Fatal("Check failed: " #condition \
" at %s, line %d .\n", __FILE__, __LINE__);
#endif
#ifndef CHECK_NOTNULL
#define CHECK_NOTNULL(pointer) \
if ((pointer) == nullptr) LightGBM::Log::Fatal(#pointer " Can't be NULL at %s, line %d .\n", __FILE__, __LINE__);
#endif
enum class LogLevel: int {
Fatal = -1,
Warning = 0,
Info = 1,
Debug = 2,
};
/*!
* \brief A static Log class
*/
class Log {
public:
/*!
* \brief Resets the minimal log level. It is INFO by default.
* \param level The new minimal log level.
*/
static void ResetLogLevel(LogLevel level) {
GetLevel() = level;
}
static void Debug(const char *format, ...) {
va_list val;
va_start(val, format);
Write(LogLevel::Debug, "Debug", format, val);
va_end(val);
}
static void Info(const char *format, ...) {
va_list val;
va_start(val, format);
Write(LogLevel::Info, "Info", format, val);
va_end(val);
}
static void Warning(const char *format, ...) {
va_list val;
va_start(val, format);
Write(LogLevel::Warning, "Warning", format, val);
va_end(val);
}
static void Fatal(const char *format, ...) {
va_list val;
char str_buf[1024];
va_start(val, format);
#ifdef _MSC_VER
vsprintf_s(str_buf, format, val);
#else
vsprintf(str_buf, format, val);
#endif
va_end(val);
fprintf(stderr, "[LightGBM] [Fatal] %s\n", str_buf);
fflush(stderr);
throw std::runtime_error(std::string(str_buf));
}
private:
static void Write(LogLevel level, const char* level_str, const char *format, va_list val) {
if (level <= GetLevel()) { // omit the message with low level
// write to STDOUT
printf("[LightGBM] [%s] ", level_str);
vprintf(format, val);
printf("\n");
fflush(stdout);
}
}
// a trick to use static variable in header file.
// May be not good, but avoid to use an additional cpp file
static LogLevel& GetLevel() { static THREAD_LOCAL LogLevel level = LogLevel::Info; return level; }
};
} // namespace LightGBM
#endif // LightGBM_UTILS_LOG_H_