Как ограничить размер журнала в C ++? - PullRequest
0 голосов
/ 22 марта 2011

В моем приложении я создаю файл журнала размером 5 КБ. Если размер файла превышает 5 КБ, я должен перезаписать старое содержимое с помощью нового содержимого.

Если у вас есть идеи, просто поделитесь со мной.

Мне также нужна реализация этой техники в c ++

Я приведу пример

Изначально файл выглядит так

sample.txt

образец текста заявки образец

Предположим, что приведенный выше пример текстового файла превышает 5 КБ, затем я добавил new в source.txt, тогда файл должен выглядеть следующим образом.

sample.txt

новый образец текста заявки сэм

С уважением, Картик

Ответы [ 6 ]

5 голосов
/ 22 марта 2011

Вот код, который я недавно написал для реализации простого ротации файла журнала:

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 голос
/ 22 марта 2011

Вы можете посчитать количество контента, которое вы вставили в журнал, и каждый раз проверять, не превышает ли оно 5 КБ. Используйте функцию как:

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

С этим уверен, что вы можете реализовать функцию записи строк.

1 голос
/ 22 марта 2011

Используя WinApi, вы должны

1) Проверьте, больше ли размер файла, чем ограничение, используя GetFileSize 2) Установите для параметра «Указатель_файла» значение 0,0 + SetEndOfFile

0 голосов
/ 22 марта 2011

log4cxx - хорошее решение, которое уже решило эту проблему, а также многие другие, которые вы, вероятно, еще не рассматривали.

0 голосов
/ 22 марта 2011

Подход, подобный следующему, может работать:

  1. Потоковое содержимое в файл с использованием iostreams (начинайте с чистого файла при каждом открытии)
  2. После потокового содержимого используйте tellp чтобы получить последнюю позицию (и, следовательно, размер файла на данный момент).
  3. Если позиция больше 5Кб, то seekp к началу потока ...
0 голосов
/ 22 марта 2011

Поскольку вы используете MFC, вы можете использовать класс CFile для управления файлами.Этот класс имеет метод GetLength, который возвращает размер файла.

Чтобы перезаписать старый контент, вы можете управлять буфером в 5000 символов, представляющим содержимое вашего файла.И при каждой записи файла вам просто нужно заменить содержимое файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...