acl  3.5.3.0
log.hpp
浏览该文件的文档.
1 #pragma once
2 #include "../acl_cpp_define.hpp"
3 #include <stdarg.h>
4 
5 #define logger_open acl::log::open
6 #define logger_close acl::log::close
7 
8 #if defined(_WIN32) || defined(_WIN64)
9 
10 # if _MSC_VER >= 1500
11 # define logger(fmt, ...) \
12  acl::log::msg4(__FILE__, __LINE__, __FUNCTION__, fmt, __VA_ARGS__)
13 # define logger_warn(fmt, ...) \
14  acl::log::warn4(__FILE__, __LINE__, __FUNCTION__, fmt, __VA_ARGS__)
15 # define logger_error(fmt, ...) \
16  acl::log::error4(__FILE__, __LINE__, __FUNCTION__, fmt, __VA_ARGS__)
17 # define logger_fatal(fmt, ...) \
18  acl::log::fatal4(__FILE__, __LINE__, __FUNCTION__, fmt, __VA_ARGS__)
19 # define logger_debug(section, level, fmt, ...) \
20  acl::log::msg6(section, level, __FILE__, __LINE__, __FUNCTION__, fmt, __VA_ARGS__)
21 # else
22 # define logger acl::log::msg1
23 # define logger_warn acl::log::warn1
24 # define logger_error acl::log::error1
25 # define logger_fatal acl::log::fatal1
26 # define logger_debug acl::log::msg3
27 # endif
28 
29 #else
30 
31 # ifdef ACL_CPP_LOG_SKIP_FILE
32 # define logger(fmt, args...) \
33  acl::log::msg4("none", __LINE__, __FUNCTION__, fmt, ##args)
34 # define logger_warn(fmt, args...) \
35  acl::log::warn4("none", __LINE__, __FUNCTION__, fmt, ##args)
36 # define logger_error(fmt, args...) \
37  acl::log::error4("none", __LINE__, __FUNCTION__, fmt, ##args)
38 # define logger_fatal(fmt, args...) \
39  acl::log::fatal4("none", __LINE__, __FUNCTION__, fmt, ##args)
40 # define logger_debug(section, level, fmt, args...) \
41  acl::log::msg6(section, level, __FUNCTION__, __LINE__, __FUNCTION__, fmt, ##args)
42 # else
43 # define logger(fmt, args...) \
44  acl::log::msg4(__FILE__, __LINE__, __FUNCTION__, fmt, ##args)
45 # define logger_warn(fmt, args...) \
46  acl::log::warn4(__FILE__, __LINE__, __FUNCTION__, fmt, ##args)
47 # define logger_error(fmt, args...) \
48  acl::log::error4(__FILE__, __LINE__, __FUNCTION__, fmt, ##args)
49 # define logger_fatal(fmt, args...) \
50  acl::log::fatal4(__FILE__, __LINE__, __FUNCTION__, fmt, ##args)
51 # define logger_debug(section, level, fmt, args...) \
52  acl::log::msg6(section, level, __FUNCTION__, __LINE__, __FUNCTION__, fmt, ##args)
53 # endif
54 
55 #endif
56 
57 namespace acl {
58 
59 class string;
60 
62 {
63 public:
64  /**
65  * 打开日志文件, 在程序初始化里调用本函数一次
66  * @param recipients {const char*} 日志接收器列表,由 "|" 分隔,接收器
67  * 可以是本地文件或远程套接口,如:
68  * /tmp/test.log|UDP:127.0.0.1:12345|TCP:127.0.0.1:12345|UNIX:/tmp/test.sock
69  * 该配置要求将所有日志同时发给 /tmp/test.log, UDP:127.0.0.1:12345,
70  * TCP:127.0.0.1:12345 和 UNIX:/tmp/test.sock 四个日志接收器对象
71  * @param procname 程序名, 如: test
72  * @param cfg 调试日志配置, 格式为: {section}:{level}; {section}:{level}; ...
73  * 如: 100:2; 101:3; 102: 4, 表示只记录标识为 100/级别 < 2,
74  * 以及标识为 101/级别 < 3, 以及标识为 102/级别 < 4 的日志项
75  */
76  static void open(const char* recipients, const char* procname = "unknown",
77  const char* cfg = NULL);
78 
79  /**
80  * 程序退出前调用此函数关闭日志
81  */
82  static void close(void);
83 
84  /**
85  * 初始化日志调试调用接口
86  * @param cfg {const char*} 调试标签及级别字符串, 格式如下:
87  * {section}:{level}; {section}:{level}; ...
88  * 如: 1:1, 2:10, 3:8... or 1:1; 2:10; 3:8... or all:1
89  */
90  static void debug_init(const char* cfg);
91 
92  /**
93  * 当未通过 open 打开日志流而调用记日志等相关函数时是否需要将信息
94  * 输出至标准输出
95  * @param onoff {bool}
96  */
97  static void stdout_open(bool onoff);
98 
99  /**
100  * 日志记录函数
101  */
102 
103  static void ACL_CPP_PRINTF(1, 2) msg1(const char* fmt, ...);
104  static void ACL_CPP_PRINTF(4, 5) msg4(const char* fname,
105  int line, const char* func, const char* fmt, ...);
106  static void ACL_CPP_PRINTF(3, 4) msg3(size_t section,
107  size_t level, const char* fmt, ...);
108  static void ACL_CPP_PRINTF(6, 7) msg6(size_t section, size_t level,
109  const char* fname, int line, const char* func, const char* fmt, ...);
110 
111  static void ACL_CPP_PRINTF(1, 2) warn1(const char* fmt, ...);
112  static void ACL_CPP_PRINTF(4, 5) warn4(const char* fname, int line,
113  const char* func, const char* fmt, ...);
114 
115  static void ACL_CPP_PRINTF(1, 2) error1(const char* fmt, ...);
116  static void ACL_CPP_PRINTF(4, 5) error4(const char* fname, int line,
117  const char* func, const char* fmt, ...);
118 
119  static void ACL_CPP_PRINTF(1, 2) fatal1(const char* fmt, ...);
120  static void ACL_CPP_PRINTF(4, 5) fatal4(const char* fname, int line,
121  const char* func, const char* fmt, ...);
122 
123  static void vmsg2(const char* fmt, va_list ap);
124  static void vmsg5(const char* fname, int line, const char* func,
125  const char* fmt, va_list ap);
126  static void vmsg4(size_t section, size_t level, const char* fmt, va_list ap);
127  static void vmsg7(size_t section, size_t level, const char* fname,
128  int line, const char* func, const char* fmt, va_list ap);
129 
130  static void vwarn2(const char* fmt, va_list ap);
131  static void vwarn5(const char* fname, int line, const char* func,
132  const char* fmt, va_list ap);
133 
134  static void verror2(const char* fmt, va_list ap);
135  static void verror5(const char* fname, int line, const char* func,
136  const char* fmt, va_list ap);
137 
138  static void vfatal2(const char* fmt, va_list ap);
139  static void vfatal5(const char* fname, int line, const char* func,
140  const char* fmt, va_list ap);
141 
142  /************************************************************************/
143  /* 示例 */
144  /************************************************************************/
145  static void logger_test1(void)
146  {
147 #define DEBUG_BASE 100
148 #define DEBUG_TEST1 (DEBUG_BASE + 1)
149 #define DEBUG_TEST2 (DEBUG_BASE + 2)
150 #define DEBUG_TEST3 (DEBUG_BASE + 3)
151 
152  const char* logfile = "test.log", *procname = "test";
153  const char* cfg = "101:2; 102:3; 103:2";
154 
155  // 在程序初始化时打开日志
156  logger_open(logfile, procname, cfg);
157 
158 #if defined(VC2003) || defined(VC2002) || defined(VC6)
159 
160  // 会写日志
161 
162  logger("%s(%d), %s: %s", __FILE__, __LINE__, __FUNCTION__, "zsx");
163 
164  logger_debug(DEBUG_TEST1, 1, "%s(%d), %s: hello world11(%s)!",
165  __FILE__, __LINE__, __FUNCTION__, "zsx");
166  logger_debug(DEBUG_TEST2, 3, "%s(%d), %s: hello world12(%s)!",
167  __FILE__, __LINE__, __FUNCTION__, "zsx");
168  logger_debug(DEBUG_TEST3, 2, "%s(%d), %s: hello world13(%s)!",
169  __FILE__, __LINE__, __FUNCTION__, "zsx");
170 
171  // 不会写日志
172 
173  logger_debug(DEBUG_TEST1, 3, "%s(%d), %s: hello world21(%s)!",
174  __FILE__, __LINE__, __FUNCTION__, "zsx");
175 
176 #else // VC2005, VC2008, VC2010
177 
178  // 会写日志
179 
180  logger("error(%s)!", "zsx");
181 
182  logger_debug(DEBUG_TEST1, 1, "hello world11(%s)!", "zsx");
183  logger_debug(DEBUG_TEST2, 3, "hello world12(%s)!", "zsx");
184  logger_debug(DEBUG_TEST3, 2, "hello world13(%s)!", "zsx");
185 
186  // 不会写日志
187 
188  logger_debug(DEBUG_TEST1, 3, "hello world21(%s)!", "zsx");
189 
190 #endif
191 
192  // 程序结束前关闭日志
193  logger_close();
194  }
195  static void logger_test2(void)
196  {
197  logger("logger ok!");
198  logger_warn("logger_warn ok!");
199  logger_error("logger_error ok!");
200  logger_fatal("logger_fatal ok!");
201  }
202 };
203 
204 } // namespace acl
#define logger(fmt, args...)
Definition: log.hpp:43
#define logger_open
Definition: log.hpp:5
#define ACL_CPP_PRINTF(format_idx, arg_idx)
Definition: atomic.hpp:75
#define logger_close
Definition: log.hpp:6
#define DEBUG_TEST1
#define logger_fatal(fmt, args...)
Definition: log.hpp:49
Definition: log.hpp:61
#define logger_error(fmt, args...)
Definition: log.hpp:47
#define DEBUG_TEST3
static void logger_test2(void)
Definition: log.hpp:195
#define logger_debug(section, level, fmt, args...)
Definition: log.hpp:51
ACL_API void const char * fmt
Definition: acl_aio.h:771
#define ACL_CPP_API
#define DEBUG_TEST2
#define logger_warn(fmt, args...)
Definition: log.hpp:45