博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
log4cpp日志不能是溶液子体积
阅读量:5773 次
发布时间:2019-06-18

本文共 2261 字,大约阅读时间需要 7 分钟。



我们的项目用途log4cpp由于日志输出模块,但在使用中发现,假设Services,或者是在Windows Server版本号。不会有一个正常的日志切削现象。该日志已被写入到文件中,持续,即使超过规定的文件大小。也不会分卷。

log4cpp中切割日志的核心算法为:(如果同意的最大文件个数为4)

1.关闭xxx.log.
2.删除 xxx.log.4
3.是一个loop, 将xxx.log.3--->xxx.log.4,xxx.log.2--->xxx.log.3,xxx.log.1----->xxx.log.2
4.将xxx.log--->xxx.log.1
5.打开xxx.log.

相关代码为:  

void RollingFileAppender::rollOver() {        ::close(_fd); // 1        if (_maxBackupIndex > 0) {             std::ostringstream oldName;             oldName << _fileName << "." << _maxBackupIndex << std::ends;             ::remove(oldName.str().c_str());   //2               size_t n = _fileName.length() + 1;             for(unsigned int i = _maxBackupIndex; i > 1; i--) {  //3                   std::string newName = oldName.str();                   oldName.seekp(n);                   oldName << i-1 << std::ends;                   ::rename(oldName.str().c_str(), newName.c_str());               }               ::rename(_fileName.c_str(), oldName.str().c_str()); //4        }        _fd = ::open(_fileName.c_str(), _flags, _mode);//5  }

日志文件无法切割(眼下发现仅仅在win server版本号无法work),原因出在步骤1,4,5上。

关闭文件后,随后将文件重命名,会导致重命名失败。通过打印错误码得知,错误码为32,意思为:文件句柄被占用。
解决方式为。往两个不同的文件中中写日志。不再仅仅往一个文件名称里写日志,交替写日志,交替关闭文件。write(A),close(B)---->Write(B),Close(A),----->Write(A),Close(B).
改动后的代码为:

void RollingFileAppender::rollOver() {          ::close(_fd);          if (_maxBackupIndex > 0) {              std::ostringstream oldName;              oldName << _fileName << "." << _maxBackupIndex << std::ends;              ::remove(oldName.str().c_str());              size_t n = _fileName.length() + 1;              for(unsigned int i = _maxBackupIndex; i > 1; i--) {                  std::string newName = oldName.str();                  oldName.seekp(n);                    oldName << i-1 << std::ends;                  ::rename(oldName.str().c_str(), newName.c_str());              }  if(_bUsingTempFile)              ::rename(_fileNameTmp.c_str(), oldName.str().c_str());  else              ::rename(_fileName.c_str(), oldName.str().c_str());          }  if(_bUsingTempFile)          _fd = ::open(_fileName.c_str(), _flags, _mode);  else          _fd = ::open(_fileNameTmp.c_str(), _flags, _mode);          _bUsingTempFile = !_bUsingTempFile;      }

版权声明:本文博主原创文章。博客,未经同意不得转载。

你可能感兴趣的文章
Java判断是否为垃圾_Java GC如何判断对象是否为垃圾
查看>>
多项式前k项和java_多项式朴素贝叶斯softmax改变
查看>>
java数组只能交换0下标和n_编程练习-只用0交换排序数组
查看>>
OracleLinux安装说明
查看>>
标准与扩展ACL 、 命名ACL 、 总结和答疑
查看>>
使用@media实现IE hack的方法
查看>>
oracle体系结构
查看>>
Microsoft Exchange Server 2010与Office 365混合部署升级到Exchange Server 2016混合部署汇总...
查看>>
Proxy服务器配置_Squid
查看>>
【SDN】Openflow协议中对LLDP算法的理解--如何判断非OF区域的存在
查看>>
纯DIV+CSS简单实现Tab选项卡左右切换效果
查看>>
Centos7同时运行多个Tomcat
查看>>
使用CocoaPods过程中的几个问题
查看>>
Spring boot 整合CXF webservice 全部被拦截的问题
查看>>
Pinpoint跨节点统计失败
查看>>
机房带宽暴涨问题分析及解决方法
查看>>
XP 安装ORACLE
查看>>
八、 vSphere 6.7 U1(八):分布式交换机配置(vMotion迁移网段)
查看>>
[转载] 中华典故故事(孙刚)——19 万岁
查看>>
php5编译安装常见错误和解决办法集锦
查看>>