forked from gfrd/egfrd
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathLogger.hpp
162 lines (122 loc) · 3.56 KB
/
Logger.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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
#ifndef LOGGER_HPP
#define LOGGER_HPP
#include <cstdarg>
#include <set>
#include <vector>
#include <string>
#include <boost/noncopyable.hpp>
#include <boost/shared_ptr.hpp>
class LogAppender;
class LoggerManager;
class LoggerManagerRegistry;
class Logger: boost::noncopyable
{
public:
enum level
{
L_OFF = 0,
L_DEBUG = 1,
L_INFO = 2,
L_WARNING = 3,
L_ERROR = 4,
L_FATAL = 5
};
public:
~Logger();
LoggerManager const& logging_manager() const;
void level(enum level level);
enum level level() const;
char const* name() const
{
return name_.c_str();
}
boost::shared_ptr<LoggerManager> manager() const;
void debug(char const* format, ...)
{
va_list ap;
va_start(ap, format);
logv(L_DEBUG, format, ap);
va_end(ap);
}
void info(char const* format, ...)
{
va_list ap;
va_start(ap, format);
logv(L_INFO, format, ap);
va_end(ap);
}
void warn(char const* format, ...)
{
va_list ap;
va_start(ap, format);
logv(L_WARNING, format, ap);
va_end(ap);
}
void error(char const* format, ...)
{
va_list ap;
va_start(ap, format);
logv(L_ERROR, format, ap);
va_end(ap);
}
void fatal(char const* format, ...)
{
va_list ap;
va_start(ap, format);
logv(L_FATAL, format, ap);
va_end(ap);
}
void log(enum level lv, char const* format, ...)
{
va_list ap;
va_start(ap, format);
logv(lv, format, ap);
va_end(ap);
}
void logv(enum level lv, char const* format, va_list ap);
void flush();
Logger(LoggerManagerRegistry const& registry, char const* name);
static Logger& get_logger(char const* name);
static char const* stringize_error_level(enum level lv);
private:
void ensure_initialized();
protected:
LoggerManagerRegistry const& registry_;
std::string const name_;
boost::shared_ptr<LoggerManager> manager_;
enum level level_;
std::vector<boost::shared_ptr<LogAppender> > appenders_;
};
class LoggerManager: boost::noncopyable
{
friend class Logger;
public:
void level(enum Logger::level level);
enum Logger::level level() const;
char const* name() const;
std::vector<boost::shared_ptr<LogAppender> > const& appenders() const;
void add_appender(boost::shared_ptr<LogAppender> const& appender);
LoggerManager(char const* name, enum Logger::level level = Logger::L_INFO);
static void register_logger_manager(char const* logger_name_pattern,
boost::shared_ptr<LoggerManager> const& manager);
static boost::shared_ptr<LoggerManager> get_logger_manager(char const* logger_name_patern);
protected:
void manage(Logger* logger);
protected:
std::string const name_;
enum Logger::level level_;
std::set<Logger*> managed_loggers_;
std::vector<boost::shared_ptr<LogAppender> > appenders_;
};
class LogAppender
{
public:
virtual ~LogAppender();
virtual void flush() = 0;
virtual void operator()(enum Logger::level lv,
char const* name, char const** chunks) = 0;
};
#define LOG_DEBUG(args) if (log_.level() == Logger::L_DEBUG) log_.debug args
#define LOG_INFO(args) if (enum Logger::level const level = log_.level()) if (level <= Logger::L_INFO) log_.info args
#define LOG_WARNING(args) if (enum Logger::level const level = log_.level()) if (level <= Logger::L_WARNING) log_.warn args
#endif /* LOGGER_HPP */