下面是一些代碼,我最近寫來實現一個簡單的日誌文件旋轉:
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
給出了要寫入日誌的下一條消息的大小。如果文件變得太大,它會被複制(舊的備份被覆蓋),並且一個新的文件被啓動。
我認爲這將刪除以前的文件,並創建新文件,如果文件大小超過。我想要的是,如果文件大小超過那麼指針將移動到頂部並替換頂部的當前內容並刪除文件中的最後一行並移動每個內容。 – karthik 2011-03-22 11:20:42
@karthik:這只是一個例子,應該很容易根據您的需求進行修改。您可以使用['seekp'](http://www.cplusplus.com/reference/iostream/ostream/seekp/)將寫入指針重置爲文件的開頭。或者你修改我的代碼以簡單地跳過備份,並且只是覆蓋日誌文件(簡單的關閉並再次打開就行了)。 – 2011-03-22 11:23:53
@space_cowboy:我檢查seekp ...通過這個我們可以移動文件中的位置。我需要的是如果我在中間添加一些字符,它不應該被替換...像數組,每個字符應該向下移動並且超出的字符只能被刪除 – karthik 2011-03-22 11:34:40