2011-03-22 84 views
0

在我的應用程序中,我正在創建大小爲5kb的日誌文件。如果我超過了5 kb的文件大小,我必須在新內容的幫助下覆蓋舊內容。如何在C++中限制日誌大小?

如果您有任何想法只是與我分享。

我還需要實現++這種技術在C

我提供一些例子

最初的文件看起來像這樣

sample.txt的

示例應用程序文本 樣品

假設上述樣本t ext文件超過5kb然後我在source.txt中添加了新的,那麼文件應該是這樣的。

sample.txt的

新的示例應用程序的文本 SAM

問候, KARTHIK

回答

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給出了要寫入日誌的下一條消息的大小。如果文件變得太大,它會被複制(舊的備份被覆蓋),並且一個新的文件被啓動。

+0

我認爲這將刪除以前的文件,並創建新文件,如果文件大小超過。我想要的是,如果文件大小超過那麼指針將移動到頂部並替換頂部的當前內容並刪除文件中的最後一行並移動每個內容。 – karthik 2011-03-22 11:20:42

+0

@karthik:這只是一個例子,應該很容易根據您的需求進行修改。您可以使用['seekp'](http://www.cplusplus.com/reference/iostream/ostream/seekp/)將寫入指針重置爲文件的開頭。或者你修改我的代碼以簡單地跳過備份,並且只是覆蓋日誌文件(簡單的關閉並再次打開就行了)。 – 2011-03-22 11:23:53

+0

@space_cowboy:我檢查seekp ...通過這個我們可以移動文件中的位置。我需要的是如果我在中間添加一些字符,它不應該被替換...像數組,每個字符應該向下移動並且超出的字符只能被刪除 – karthik 2011-03-22 11:34:40

1

使用WINAPI,你應該

1)檢查文件是否比限制更大使用GetFileSize 2)將SetFilePointer設置爲0,0 + SetEndOfFile

+0

爲什麼使用WinApi這麼簡單的事情呢?我覺得這就是爲什麼這麼多代碼很難移植的原因... – alternative 2011-03-22 11:00:07

+1

由於問題被標記爲MFC,因此使用Windows API調用似乎是合理的。 – zenzelezz 2011-03-22 11:11:11

+0

@mathepic:因爲速度更快,更乾淨,並且不依賴於MFC代碼。 – vlg789 2011-03-22 11:30:50

1

您可以計算您插入到日誌中的內容數量,並檢查它是否每次都大於5kb。使用像這樣的功能:

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

有了這個確定,你可以實現字符串寫入功能。

0

由於您使用MFC,因此可以使用CFile類進行文件管理。這個類有一個返回文件大小的GetLength方法。

要覆蓋舊內容,您可以管理代表文件內容的5000個字符的緩衝區。而在每個文件寫作你只需要替換文件內容。

0

象下面的方法可以工作:

  1. 流內容使用輸入輸出流
  2. (每次打開開始用乾淨的文件)流媒體內容後提交,使用tellp得到最後放位置(因此到目前爲止文件的大小)。
  3. 如果位置比爲5Kb越大,則seekp以流的begining ...
0

log4cxx是一個很好的解決方案,已經解決了這個問題,還有更多的你可能還沒有考慮過。