1717 * project authors may be found in the CONTRIBUTORS.md file in the root
1818 * of the source tree.
1919 */
20- #include " log_imp .h"
20+ #include " log_impl .h"
2121
2222#include < sys/time.h>
2323#include < sys/syscall.h>
2929#include < mutex>
3030
3131namespace {
32- constexpr uint32_t LOG_MAX_LEN = (100 << 10 );
32+
33+ size_t _LogTextMaxLength = (100 << 10 ); // ! 限定单条日志最大长度,默认为100KB
3334
3435std::mutex _lock;
3536uint32_t _id_alloc = 0 ;
@@ -76,8 +77,8 @@ const char LOG_LEVEL_LEVEL_CODE[LOG_LEVEL_MAX] = {
7677};
7778
7879const char * LOG_LEVEL_COLOR_CODE[LOG_LEVEL_MAX] = {
79- " 31 " , // ! FATAL 红
80- " 7;91 " , // ! ERROR 文字黑,背景亮红
80+ " 7;91 " , // ! FATAL 文字黑,背景亮红
81+ " 31 " , // ! ERROR 红
8182 " 7;93" , // ! WARN 文字黑,背景亮黄
8283 " 93" , // ! NOTICE 亮黄
8384 " 7;92" , // ! IMPORTANT 文字黑,背景亮绿
@@ -86,6 +87,22 @@ const char* LOG_LEVEL_COLOR_CODE[LOG_LEVEL_MAX] = {
8687 " 35" , // ! TRACE 洋葱红
8788};
8889
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+
89106/* *
90107 * \brief 日志格式化打印接口的实现
91108 *
@@ -120,42 +137,66 @@ void LogPrintfFunc(const char *module_id, const char *func_name, const char *fil
120137 .level = level,
121138 .text_len = 0 ,
122139 .text_ptr = nullptr ,
140+ .text_trunc = false ,
123141 };
124142
125143 if (fmt != nullptr ) {
126144 if (with_args) {
127- uint32_t buff_size = 1024 ; // ! 初始大小,可应对绝大数情况
145+ uint32_t buff_size = std::min (2048lu, _LogTextMaxLength) + 1 ;
146+
128147 for (;;) {
129148 va_list args;
130149 char buffer[buff_size];
131150
132151 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+
134159 va_end (args);
135160
161+ // ! 如果buffer的空间够用,则正常派发日志
162+ // ! 否则要对buffer空间进行扩张,或是对内容进行截断
136163 if (len < buff_size) {
137164 content.text_len = len;
138165 content.text_ptr = buffer;
139166 Dispatch (content);
140167 break ;
141168 }
142169
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 ;
147177 }
148178 }
179+
149180 } else {
150181 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+
151189 content.text_ptr = fmt;
152190 Dispatch (content);
153191 }
192+
154193 } else {
155194 Dispatch (content);
156195 }
157196}
158197
198+ }
199+
159200uint32_t LogAddPrintfFunc (LogPrintfFuncType func, void *ptr)
160201{
161202 std::lock_guard<std::mutex> lg (_lock);
0 commit comments