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);
83 int warnning(T message);
94 int output(
const LOG_LEVEL level,
const char *module,
const char *prefix,
const char *f, ...);
96 int set_console_level(
const LOG_LEVEL console_level);
97 LOG_LEVEL get_console_level();
99 int set_log_level(
const LOG_LEVEL log_level);
100 LOG_LEVEL get_log_level();
102 int set_rotate_type(LOG_ROTATE rotate_type);
103 LOG_ROTATE get_rotate_type();
105 const char *prefix_msg(
const LOG_LEVEL level);
113 bool check_output(
const LOG_LEVEL log_level,
const char *module);
115 int rotate(
const int year = 0,
const int month = 0,
const int day = 0);
123 intptr_t context_id();
126 void check_param_valid();
128 int rotate_by_size();
129 int rename_old_logs();
130 int rotate_by_day(
const int year,
const int month,
const int day);
133 int out(
const LOG_LEVEL console_level,
const LOG_LEVEL log_level, T &message);
136 pthread_mutex_t lock_;
139 LOG_LEVEL log_level_;
140 LOG_LEVEL console_level_;
151 LOG_ROTATE rotate_type_;
153 typedef map<LOG_LEVEL, string> LogPrefixMap;
154 LogPrefixMap prefix_map_;
156 typedef set<string> DefaultSet;
157 DefaultSet default_set_;
159 function<intptr_t()> context_getter_;
168 static int init(
const string &log_file,
Log **logger, LOG_LEVEL log_level = LOG_LEVEL_INFO,
169 LOG_LEVEL console_level = LOG_LEVEL_WARN, LOG_ROTATE rotate_type = LOG_ROTATE_BYDAY);
171 static int init_default(
const string &log_file, LOG_LEVEL log_level = LOG_LEVEL_INFO,
172 LOG_LEVEL console_level = LOG_LEVEL_WARN, LOG_ROTATE rotate_type = LOG_ROTATE_BYDAY);
178#define __FILE_NAME__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__)
181#define LOG_HEAD_SIZE 128
183#define LOG_HEAD(prefix, level) \
184 if (common::g_log) { \
186 gettimeofday(&tv, NULL); \
187 struct tm curr_time; \
188 struct tm *p = localtime_r(&tv.tv_sec, &curr_time); \
190 char sz_head[LOG_HEAD_SIZE] = {0}; \
192 int usec = (int)tv.tv_usec; \
195 "%04d-%02d-%02d %02d:%02d:%02u.%06d pid:%u tid:%llx ctx:%lx", \
205 common::g_log->context_id()); \
206 common::g_log->rotate(p->tm_year + 1900, p->tm_mon + 1, p->tm_mday); \
210 "[%s %s %s@%s:%u] >> ", \
212 (common::g_log)->prefix_msg(level), \
215 (int32_t)__LINE__); \
218#define LOG_OUTPUT(level, fmt, ...) \
220 using namespace common; \
221 if (g_log && g_log->check_output(level, __FILE_NAME__)) { \
222 char prefix[ONE_KILO] = {0}; \
223 LOG_HEAD(prefix, level); \
224 g_log->output(level, __FILE_NAME__, prefix, fmt, ##__VA_ARGS__); \
228#define LOG_DEFAULT(fmt, ...) LOG_OUTPUT(common::g_log->get_log_level(), fmt, ##__VA_ARGS__)
229#define LOG_PANIC(fmt, ...) LOG_OUTPUT(common::LOG_LEVEL_PANIC, fmt, ##__VA_ARGS__)
230#define LOG_ERROR(fmt, ...) LOG_OUTPUT(common::LOG_LEVEL_ERR, fmt, ##__VA_ARGS__)
231#define LOG_WARN(fmt, ...) LOG_OUTPUT(common::LOG_LEVEL_WARN, fmt, ##__VA_ARGS__)
232#define LOG_INFO(fmt, ...) LOG_OUTPUT(common::LOG_LEVEL_INFO, fmt, ##__VA_ARGS__)
233#define LOG_DEBUG(fmt, ...) LOG_OUTPUT(common::LOG_LEVEL_DEBUG, fmt, ##__VA_ARGS__)
234#define LOG_TRACE(fmt, ...) LOG_OUTPUT(common::LOG_LEVEL_TRACE, fmt, ##__VA_ARGS__)
240 out(console_level_, log_level_, msg);
245int Log::panic(T message)
247 return out(LOG_LEVEL_PANIC, LOG_LEVEL_PANIC, message);
251int Log::error(T message)
253 return out(LOG_LEVEL_ERR, LOG_LEVEL_ERR, message);
257int Log::warnning(T message)
259 return out(LOG_LEVEL_WARN, LOG_LEVEL_WARN, message);
263int Log::info(T message)
265 return out(LOG_LEVEL_INFO, LOG_LEVEL_INFO, message);
269int Log::debug(T message)
271 return out(LOG_LEVEL_DEBUG, LOG_LEVEL_DEBUG, message);
275int Log::trace(T message)
277 return out(LOG_LEVEL_TRACE, LOG_LEVEL_TRACE, message);
281int Log::out(
const LOG_LEVEL console_level,
const LOG_LEVEL log_level, T &msg)
284 if (console_level < LOG_LEVEL_PANIC || console_level > console_level_ || log_level < LOG_LEVEL_PANIC ||
285 log_level > log_level_) {
286 return LOG_STATUS_OK;
289 char prefix[ONE_KILO] = {0};
290 LOG_HEAD(prefix, log_level);
291 if (LOG_LEVEL_PANIC <= console_level && console_level <= console_level_) {
292 cout << prefix_map_[console_level] << msg;
295 if (LOG_LEVEL_PANIC <= log_level && log_level <= log_level_) {
296 pthread_mutex_lock(&lock_);
302 pthread_mutex_unlock(&lock_);
305 }
catch (exception &e) {
307 pthread_mutex_unlock(&lock_);
309 cerr << e.what() << endl;
310 return LOG_STATUS_ERR;
313 return LOG_STATUS_OK;
318#define ASSERT(expression, description, ...) \
320 if (!(expression)) { \
321 LOG_PANIC(description, ##__VA_ARGS__); \
322 LOG_PANIC("%s", lbt()); \
323 assert(expression); \
328#define ASSERT(expression, description, ...) \
330 (void)(expression); \
338#define TRACE(format, ...) LOG_TRACE(format, ##__VA_ARGS__)
345#define SYS_OUTPUT_FILE_POS ", File:" << __FILE__ << ", line:" << __LINE__ << ",function:" << __FUNCTION__
346#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:237