如何在c ++中限制日志大小?

时间:2011-03-22 10:47:26

标签: c++ c visual-c++ mfc

在我的应用程序中,我创建了大小为5kb的日志文件。如果我的文件大小超过5 kb,我必须借助新内容覆盖旧内容。

如果您有任何想法,请与我分享。

我还需要在c ++中实现这种技术

我提供了一些例子

最初文件看起来像这样

sample.txt的

示例应用程序文本 样品

假设上面的示例文本文件超过5kb然后我在source.txt中添加 new ,那么文件应该是这样的。

sample.txt的

新的示例应用程序文本 SAM

此致 KARTHIK

6 个答案:

答案 0 :(得分:5)

以下是我最近为实现简单的日志文件轮换而编写的一些代码:

std::ostream & libLogging::FileRotationLogSink::GetCurrentStream( 
    std::string::size_type required )
{
    if ( static_cast<std::string::size_type>(m_CurrentStream.tellp( )) + 
        required > m_Limit ) {
        m_CurrentStream.close();
        // remove old backup
        if ( boost::filesystem::exists( m_BackupPath ) ) {
            boost::filesystem::remove( m_BackupPath );
        }
        // backup current logfile
        boost::filesystem::rename( m_LogFilePath, m_BackupPath );
        // open new logfile
        m_CurrentStream.open( m_LogFilePath );
    }
    return m_CurrentStream;
}

required给出要写入日志的下一条消息的大小。如果文件太大,则会复制(旧备份被覆盖),并启动一个新文件。

答案 1 :(得分:1)

使用WinApi,你应该

1)使用GetFileSize检查文件是否大于限制 2)SetFilePointer为0,0 + SetEndOfFile

答案 2 :(得分:1)

您可以计算插入日志的内容量,并检查每次是否超过5kb。使用如下函数:

void writeToLog(char c) {
  if(writeIndex == 5000)
    writeIndex =0;
  log[writeIndex] = c;
  writeIndex += 1;
}

确保你可以实现字符串写入功能。

答案 3 :(得分:0)

由于您使用的是MFC,因此可以使用CFile类进行文件管理。该类有一个GetLength方法,它返回文件的大小。

要覆盖旧内容,您可以管理代表文件内容的5000个字符的缓冲区。在每个文件写入时,您只需要替换文件内容。

答案 4 :(得分:0)

以下方法可行:

  1. 使用iostreams将内容流式传输到文件(每次打开时都以干净的文件开头)
  2. 播放内容后,使用tellp获取最后一个放置位置(以及到目前为止的文件大小)。
  3. 如果位置大于5Kb,那么seekp开始流......

答案 5 :(得分:0)

log4cxx是一个很好的解决方案,已经解决了这个问题,还有更多你可能还没有考虑过。