23#include "common/defs.h"
24#include "common/lang/string.h"
25#include "common/lang/map.h"
26#include "common/lang/set.h"
27#include "common/lang/functional.h"
28#include "common/lang/iostream.h"
29#include "common/lang/fstream.h"
33const unsigned int ONE_KILO = 1024;
34const unsigned int FILENAME_LENGTH_MAX = 256;
36const int LOG_STATUS_OK = 0;
37const int LOG_STATUS_ERR = 1;
38const int LOG_MAX_LINE = 100000;
61 Log(
const string &log_name,
const LOG_LEVEL log_level = LOG_LEVEL_INFO,
62 const LOG_LEVEL console_level = LOG_LEVEL_WARN);
65 static int init(
const string &log_file);
84 int warnning(T message);
95 int output(
const LOG_LEVEL level,
const char *module,
const char *prefix,
const char *f, ...);
97 int set_console_level(
const LOG_LEVEL console_level);
98 LOG_LEVEL get_console_level();
100 int set_log_level(
const LOG_LEVEL log_level);
101 LOG_LEVEL get_log_level();
103 int set_rotate_type(LOG_ROTATE rotate_type);
104 LOG_ROTATE get_rotate_type();
106 const char *prefix_msg(
const LOG_LEVEL level);
114 bool check_output(
const LOG_LEVEL log_level,
const char *module);
116 int rotate(
const int year = 0,
const int month = 0,
const int day = 0);
124 intptr_t context_id();
127 void check_param_valid();
129 int rotate_by_size();
130 int rename_old_logs();
131 int rotate_by_day(
const int year,
const int month,
const int day);
134 int out(
const LOG_LEVEL console_level,
const LOG_LEVEL log_level, T &message);
137 pthread_mutex_t lock_;
140 LOG_LEVEL log_level_;
141 LOG_LEVEL console_level_;
152 LOG_ROTATE rotate_type_;
154 typedef map<LOG_LEVEL, string> LogPrefixMap;
155 LogPrefixMap prefix_map_;
157 typedef set<string> DefaultSet;
158 DefaultSet default_set_;
160 function<intptr_t()> context_getter_;
169 static int init(
const string &log_file,
Log **logger, LOG_LEVEL log_level = LOG_LEVEL_INFO,
170 LOG_LEVEL console_level = LOG_LEVEL_WARN, LOG_ROTATE rotate_type = LOG_ROTATE_BYDAY);
172 static int init_default(
const string &log_file, LOG_LEVEL log_level = LOG_LEVEL_INFO,
173 LOG_LEVEL console_level = LOG_LEVEL_WARN, LOG_ROTATE rotate_type = LOG_ROTATE_BYDAY);
179#define __FILE_NAME__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__)
182#define LOG_HEAD_SIZE 128
184#define LOG_HEAD(prefix, level) \
185 if (common::g_log) { \
187 gettimeofday(&tv, NULL); \
188 struct tm curr_time; \
189 struct tm *p = localtime_r(&tv.tv_sec, &curr_time); \
191 char sz_head[LOG_HEAD_SIZE] = {0}; \
193 int usec = (int)tv.tv_usec; \
196 "%04d-%02d-%02d %02d:%02d:%02u.%06d pid:%u tid:%llx ctx:%lx", \
206 common::g_log->context_id()); \
207 common::g_log->rotate(p->tm_year + 1900, p->tm_mon + 1, p->tm_mday); \
211 "[%s %s %s@%s:%u] >> ", \
213 (common::g_log)->prefix_msg(level), \
216 (int32_t)__LINE__); \
219#define LOG_OUTPUT(level, fmt, ...) \
221 using namespace common; \
222 if (g_log && g_log->check_output(level, __FILE_NAME__)) { \
223 char prefix[ONE_KILO] = {0}; \
224 LOG_HEAD(prefix, level); \
225 g_log->output(level, __FILE_NAME__, prefix, fmt, ##__VA_ARGS__); \
229#define LOG_DEFAULT(fmt, ...) LOG_OUTPUT(common::g_log->get_log_level(), fmt, ##__VA_ARGS__)
230#define LOG_PANIC(fmt, ...) LOG_OUTPUT(common::LOG_LEVEL_PANIC, fmt, ##__VA_ARGS__)
231#define LOG_ERROR(fmt, ...) LOG_OUTPUT(common::LOG_LEVEL_ERR, fmt, ##__VA_ARGS__)
232#define LOG_WARN(fmt, ...) LOG_OUTPUT(common::LOG_LEVEL_WARN, fmt, ##__VA_ARGS__)
233#define LOG_INFO(fmt, ...) LOG_OUTPUT(common::LOG_LEVEL_INFO, fmt, ##__VA_ARGS__)
234#define LOG_DEBUG(fmt, ...) LOG_OUTPUT(common::LOG_LEVEL_DEBUG, fmt, ##__VA_ARGS__)
235#define LOG_TRACE(fmt, ...) LOG_OUTPUT(common::LOG_LEVEL_TRACE, fmt, ##__VA_ARGS__)
241 out(console_level_, log_level_, msg);
246int Log::panic(T message)
248 return out(LOG_LEVEL_PANIC, LOG_LEVEL_PANIC, message);
252int Log::error(T message)
254 return out(LOG_LEVEL_ERR, LOG_LEVEL_ERR, message);
258int Log::warnning(T message)
260 return out(LOG_LEVEL_WARN, LOG_LEVEL_WARN, message);
264int Log::info(T message)
266 return out(LOG_LEVEL_INFO, LOG_LEVEL_INFO, message);
270int Log::debug(T message)
272 return out(LOG_LEVEL_DEBUG, LOG_LEVEL_DEBUG, message);
276int Log::trace(T message)
278 return out(LOG_LEVEL_TRACE, LOG_LEVEL_TRACE, message);
282int Log::out(
const LOG_LEVEL console_level,
const LOG_LEVEL log_level, T &msg)
285 if (console_level < LOG_LEVEL_PANIC || console_level > console_level_ || log_level < LOG_LEVEL_PANIC ||
286 log_level > log_level_) {
287 return LOG_STATUS_OK;
290 char prefix[ONE_KILO] = {0};
291 LOG_HEAD(prefix, log_level);
292 if (LOG_LEVEL_PANIC <= console_level && console_level <= console_level_) {
293 cout << prefix_map_[console_level] << msg;
296 if (LOG_LEVEL_PANIC <= log_level && log_level <= log_level_) {
297 pthread_mutex_lock(&lock_);
303 pthread_mutex_unlock(&lock_);
306 }
catch (exception &e) {
308 pthread_mutex_unlock(&lock_);
310 cerr << e.what() << endl;
311 return LOG_STATUS_ERR;
314 return LOG_STATUS_OK;
319#define ASSERT(expression, description, ...) \
321 if (!(expression)) { \
322 LOG_PANIC(description, ##__VA_ARGS__); \
323 LOG_PANIC("%s", lbt()); \
324 assert(expression); \
329#define ASSERT(expression, description, ...) \
331 (void)(expression); \
339#define TRACE(format, ...) LOG_TRACE(format, ##__VA_ARGS__)
346#define SYS_OUTPUT_FILE_POS ", File:" << __FILE__ << ", line:" << __LINE__ << ",function:" << __FUNCTION__
347#define SYS_OUTPUT_ERROR ",error:" << errno << ":" << strerror(errno)
void set_context_getter(function< intptr_t()> context_getter)
设置一个在日志中打印当前上下文信息的回调函数
Definition: log.cpp:307
void set_default_module(const string &modules)
Definition: log.cpp:172
Log & operator<<(T message)
Definition: log.h:238