17
17
* project authors may be found in the CONTRIBUTORS.md file in the root
18
18
* of the source tree.
19
19
*/
20
- #include " log_imp .h"
20
+ #include " log_impl .h"
21
21
22
22
#include < sys/time.h>
23
23
#include < sys/syscall.h>
29
29
#include < mutex>
30
30
31
31
namespace {
32
- constexpr uint32_t LOG_MAX_LEN = (100 << 10 );
32
+
33
+ size_t _LogTextMaxLength = (100 << 10 ); // ! 限定单条日志最大长度,默认为100KB
33
34
34
35
std::mutex _lock;
35
36
uint32_t _id_alloc = 0 ;
@@ -76,8 +77,8 @@ const char LOG_LEVEL_LEVEL_CODE[LOG_LEVEL_MAX] = {
76
77
};
77
78
78
79
const char * LOG_LEVEL_COLOR_CODE[LOG_LEVEL_MAX] = {
79
- " 31 " , // ! FATAL 红
80
- " 7;91 " , // ! ERROR 文字黑,背景亮红
80
+ " 7;91 " , // ! FATAL 文字黑,背景亮红
81
+ " 31 " , // ! ERROR 红
81
82
" 7;93" , // ! WARN 文字黑,背景亮黄
82
83
" 93" , // ! NOTICE 亮黄
83
84
" 7;92" , // ! IMPORTANT 文字黑,背景亮绿
@@ -86,6 +87,22 @@ const char* LOG_LEVEL_COLOR_CODE[LOG_LEVEL_MAX] = {
86
87
" 35" , // ! TRACE 洋葱红
87
88
};
88
89
90
+ extern " C" {
91
+
92
+ size_t LogSetMaxLength (size_t max_len)
93
+ {
94
+ std::lock_guard<std::mutex> lg (_lock);
95
+ auto origin_len = _LogTextMaxLength;
96
+ _LogTextMaxLength = max_len;
97
+ return origin_len;
98
+ }
99
+
100
+ size_t LogGetMaxLength ()
101
+ {
102
+ std::lock_guard<std::mutex> lg (_lock);
103
+ return _LogTextMaxLength;
104
+ }
105
+
89
106
/* *
90
107
* \brief 日志格式化打印接口的实现
91
108
*
@@ -120,42 +137,66 @@ void LogPrintfFunc(const char *module_id, const char *func_name, const char *fil
120
137
.level = level,
121
138
.text_len = 0 ,
122
139
.text_ptr = nullptr ,
140
+ .text_trunc = false ,
123
141
};
124
142
125
143
if (fmt != nullptr ) {
126
144
if (with_args) {
127
- uint32_t buff_size = 1024 ; // ! 初始大小,可应对绝大数情况
145
+ uint32_t buff_size = std::min (2048lu, _LogTextMaxLength) + 1 ;
146
+
128
147
for (;;) {
129
148
va_list args;
130
149
char buffer[buff_size];
131
150
132
151
va_start (args, fmt);
133
- size_t len = vsnprintf (buffer, buff_size, fmt, args);
152
+ size_t len = 0 ;
153
+
154
+ len = ::vsnprintf (buffer, buff_size, fmt, args);
155
+
156
+ if (content.text_trunc )
157
+ len = _LogTextMaxLength;
158
+
134
159
va_end (args);
135
160
161
+ // ! 如果buffer的空间够用,则正常派发日志
162
+ // ! 否则要对buffer空间进行扩张,或是对内容进行截断
136
163
if (len < buff_size) {
137
164
content.text_len = len;
138
165
content.text_ptr = buffer;
139
166
Dispatch (content);
140
167
break ;
141
168
}
142
169
143
- buff_size = len + 1 ; // ! 要多留一个结束符 \0,否则 vsnprintf() 会少一个字符
144
- if (buff_size > LOG_MAX_LEN) {
145
- std::cerr << " WARN: log text length " << buff_size << " , too long!" << std::endl;
146
- break ;
170
+ // ! 没有超过MaxLength,则进行扩张
171
+ if (len <= _LogTextMaxLength) {
172
+ buff_size = len + 1 ; // ! 要多留一个结束符 \0,否则 vsnprintf() 会少一个字符
173
+
174
+ } else { // ! 否则进行截断处理
175
+ buff_size = _LogTextMaxLength + 1 ; // ! 同上
176
+ content.text_trunc = true ;
147
177
}
148
178
}
179
+
149
180
} else {
150
181
content.text_len = ::strlen (fmt);
182
+
183
+ // ! 如果超出最大长度,要限制
184
+ if (content.text_len > _LogTextMaxLength) {
185
+ content.text_len = _LogTextMaxLength;
186
+ content.text_trunc = true ;
187
+ }
188
+
151
189
content.text_ptr = fmt;
152
190
Dispatch (content);
153
191
}
192
+
154
193
} else {
155
194
Dispatch (content);
156
195
}
157
196
}
158
197
198
+ }
199
+
159
200
uint32_t LogAddPrintfFunc (LogPrintfFuncType func, void *ptr)
160
201
{
161
202
std::lock_guard<std::mutex> lg (_lock);
0 commit comments