-
Notifications
You must be signed in to change notification settings - Fork 0
/
logger.h
148 lines (127 loc) · 4.39 KB
/
logger.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
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
/**
# -*- coding:UTF-8 -*-
*/
#ifndef _LOGGER_H_
#define _LOGGER_H_
#include <stdio.h>
#include <time.h>
#include <errno.h>
#include "define.h"
#include "fs_utility.h"
#ifdef _WIN32
#ifndef localtime_r
#define localtime_r(unix_time, tms) localtime_s(tms, unix_time)
#endif
#ifndef snprintf
#define snprintf(buffer, buffer_size, fmt, ...) _snprintf(buffer, buffer_size, fmt, ##__VA_ARGS__)
#endif
#endif
#ifndef __FUNCSIG__
#ifdef __PRETTY_FUNCTION__
#define __FUNCSIG__ __PRETTY_FUNCTION__
#elif defined __FUNCTION__
#define __FUNCSIG__ __FUNCTION__
#else
#define __FUNCSIG__ __func__
#endif
#endif
#define LOGGER_LINE_SIZE 4096
#ifdef __cplusplus
extern "C"
{
#endif
enum e_logger_level_t
{
LOGGER_ALL = 0,
LOGGER_TRACE = 2,
LOGGER_DEBUG = 3,
LOGGER_INFO = 4,
LOGGER_WARN = 5,
LOGGER_ERROR = 6,
LOGGER_FATAL = 7,
LOGGER_NULL = 8,
};
typedef struct s_logger_t
{
int fd;
int32_t level;
uint32_t file_size_limit;
uint32_t file_count_limit;
char file_name[MAX_PATH];//just name format
uint32_t file_count; //current log file count
uint32_t file_size; //current log file size
} Logger;
extern Logger* default_logger;
int32_t logger_impl(/*const */Logger* self, const char* buf, uint32_t l);
extern char logger_time_string_buffer[24];
void logger_update_time_string();
#define _logger_wrapper(logger, logger_level, file, line, func, fmt, ...) \
if (LOGGER_##logger_level >= logger->level)\
{\
char _lg_buf[LOGGER_LINE_SIZE]; \
int32_t _lg_l; \
logger_update_time_string(); \
_lg_l = snprintf(_lg_buf, LOGGER_LINE_SIZE, "["#logger_level"] %s [%s:%u: %s] "fmt"\n", logger_time_string_buffer, file, line, func, ##__VA_ARGS__); \
if(_lg_l>0)logger_impl(logger,_lg_buf,_lg_l<LOGGER_LINE_SIZE?_lg_l:LOGGER_LINE_SIZE-1); \
}\
else\
{\
}
#define logger_trace(logger, fmt, ...) _logger_wrapper(logger, TRACE, __FILE__, __LINE__, __FUNCSIG__, fmt, ##__VA_ARGS__)
#define logger_debug(logger, fmt, ...) _logger_wrapper(logger, DEBUG, __FILE__, __LINE__, __FUNCSIG__, fmt, ##__VA_ARGS__)
#define logger_info(logger, fmt, ...) _logger_wrapper(logger, INFO, __FILE__, __LINE__, __FUNCSIG__, fmt, ##__VA_ARGS__)
#define logger_warn(logger, fmt, ...) _logger_wrapper(logger, WARN, __FILE__, __LINE__, __FUNCSIG__, fmt, ##__VA_ARGS__)
#define logger_error(logger, fmt, ...) _logger_wrapper(logger, ERROR, __FILE__, __LINE__, __FUNCSIG__, fmt, ##__VA_ARGS__)
#define logger_fatal(logger, fmt, ...) _logger_wrapper(logger, FATAL, __FILE__, __LINE__, __FUNCSIG__, fmt, ##__VA_ARGS__)
#define TRACE_FUNCTION(func, ...) \
{\
struct timeval _t_s;\
struct timeval _t_e;\
gettimeofday(&_t_s, NULL);\
func(__VA_ARGS__); \
gettimeofday(&_t_e, NULL); \
logger_debug(default_logger, "%s return, cost:%u.%06us", #func, (uint32_t)(_t_e.tv_sec - _t_s.tv_sec - (_t_e.tv_usec < _t_s.tv_usec)), (uint32_t)(_t_e.tv_usec < _t_s.tv_usec)*1000000 + _t_e.tv_usec - _t_s.tv_usec)); \
}
#define TRACE_FUNCTION_CHECK_RET(ret, func, ...) \
{\
struct timeval _t_s; \
struct timeval _t_e; \
gettimeofday(&_t_s, NULL); \
ret = func(__VA_ARGS__); \
gettimeofday(&_t_e, NULL); \
logger_debug(default_logger, "%s return:%d, cost:%u.%06us", #func, ret, (uint32_t)(_t_e.tv_sec - _t_s.tv_sec - (_t_e.tv_usec < _t_s.tv_usec)), (uint32_t)((_t_e.tv_usec < _t_s.tv_usec)*1000000 + _t_e.tv_usec - _t_s.tv_usec)); \
}
#ifdef _DEBUG
#define logger_assert(expr) \
if (!(expr))\
{\
int32_t _logger_error_number = errno;\
logger_fatal(default_logger, "Assertion '"#expr"' failed. errno:%d[%s]", _logger_error_number, strerror(_logger_error_number)); \
fprintf(stderr, "%s: %u: %s: Assertion '"#expr"' failed.\n", __FILE__, __LINE__, __FUNCSIG__); \
abort();\
}
#define logger_assert_ret_val(ret) \
if (ret != 0)\
{\
logger_fatal(default_logger, #ret" = %d.", ret); \
fprintf(stderr, "%s: %u: %s: "#ret" = %d\n", __FILE__, __LINE__, __FUNCSIG__, ret); \
abort(); \
}
#define logger_assert_false() \
{\
logger_fatal(default_logger, "Assertion fatal error."); \
fprintf(stderr, "%s: %u: %s: Assertion fatal error.\n", __FILE__, __LINE__, __FUNCSIG__); \
abort(); \
}
#else
#define logger_assert(expr)
#define logger_assert_ret_val(ret)
#define logger_assert_false()
#endif
int32_t logger_initialize(Logger* self);
void logger_finalize(Logger* self);
int32_t logger_load_cfg(Logger* self, const char* cfg_file);
#ifdef __cplusplus
}
#endif
#endif