glog单行 30000 字节限制问题

起因

偶然打印了一个超长的单行日志,发现glog进行了截断,后续的没有打印.

排查

排查后,发现是在源码里写死的.

可以在logging.cc 源文件里找到这个变量 kMaxLogMessageLen

cpp 复制代码
// An arbitrary limit on the length of a single log message.  This
// is so that streaming can be done more efficiently.
const size_t LogMessage::kMaxLogMessageLen = 30000;

struct LogMessage::LogMessageData  {
  LogMessageData();

  int preserved_errno_;      // preserved errno
  // Buffer space; contains complete message text.
  char message_text_[LogMessage::kMaxLogMessageLen+1];

const 的哦

解决

1.方案1: 修改代码后重新编译.

当然,可以解决问题,但是吧,有以下问题.

  • 多长算够呢 ?
  • 而且还要重新编译,现在用的动态库的话,还要替换库.

2.方案2: 自定义一个多次输出的处理函数

大概是这个意思,就是自己分成多条进行输出.

当然,还有更好的实现方式,暂时这样就行,只是一个处理思路.

cpp 复制代码
string log_str;//超长的日志
constexpr int kMaxChunkSize = google::LogMessage::kMaxLogMessageLen - 100;
const size_t len = log_str.length();
const size_t total = (len + kMaxChunkSize - 1) / kMaxChunkSize;  // 向上取整

for (size_t i = 0, pack = 1; i < len; i += kMaxChunkSize, ++pack) {
    LOG(INFO) << "[" << pack << "/" << total << "] " << std::string_view(log_str.data() + i, std::min<size_t>(kMaxChunkSize, len - i));
    // 标准低于C++17的话,考虑下substr
    //LOG(INFO) << "[" << pack_i << "/" << total_packets << "]"  << log_str.substr(i, max_length) << std::endl;
}

应该还有更好的处理方式,暂时不想深入这个库的原理.

其它具体形式优化上,推荐 宏定义形式的函数.

但是,最好别搞成普通调用函数,不然,输出的行号和实际日志位置就不一样了.

相关推荐
蜡笔小马3 分钟前
03.C++设计模式-原型模式
c++·设计模式·原型模式
神仙别闹7 分钟前
基于QT(C++)实现线性表的建立、插入、删除、查找等基本操作
java·c++·qt
salipopl25 分钟前
C/C++ 中 volatile 关键字详解:原理、作用与实际应用
开发语言·c++
张赫轩(不重名)25 分钟前
图论3:连通性问题(复杂度均为 O(N + M) )
c++·算法·图论·拓扑学
AIminminHu33 分钟前
(让 C++ 程序长出大脑:从“语音遥控器”到具身智能 Agent 的进化之路)------OpenGL渲染与几何内核那点事------(二-1-(15))
开发语言·c++·agent·具身智能
君义_noip1 小时前
CSP-J 2025 入门级 第一轮(初赛) 完善程序(1)
c++·算法·信息学奥赛·csp 第一轮
哭泣方源炼蛊2 小时前
AtCoder Beginner Contest 456 E补题(分层图 + 有向环检测 )
c++·算法·深度优先·图论·拓扑学
Yuk丶2 小时前
UE4 与 UE5:技术差异深度解析
c++·ue5·游戏引擎·ue4·游戏程序·虚幻
故事和你913 小时前
洛谷-数据结构2-1-二叉堆与树状数组1
开发语言·数据结构·c++·算法·动态规划·图论
海参崴-3 小时前
C++ STL篇 红黑树的模拟实现
开发语言·c++