Класс для ведения лога на C++

в 6:22, , рубрики: c++, variadic, лог, Программирование, метки: , ,

Может стать весьма затруднительно использовать С++ в масштабных проектах, где вы просто физически не может следить за всеми переменными.
Избавиться от некоторых трудностей может помочь простой класс для ведения лога, который, в большинстве случаев (но не всегда) может избавить вас от зависимости от отладчиков.

Допустим, вы заинтересовались вопросом и у вас уже созданы файлы log.h и log.cpp. Заголовочный файл log.h будет выглядеть вот так:

#include <fstream>
 
using namespace std;

class Log {
public:
    Log(char* filename);
    ~Log();
    void Write(char* logline);
private:
    ofstream m_stream;
};

fstream был включен для ofstream (output file system), думаю, это не новость.

Класс содержит один член private — m_stream, который будет «файловым потоком» для ведения лога.
Есть 3 функции: конструктор Log, принимающий имя файла, деструктор ~Log для закрытия файла и, наконец, функция записи Write, которая принимает строку для записи в лог.

Файл реализации log.cpp:

#include "log.h"

Log::Log(char* filename) {
    m_stream.open(filename);
}

void Log::Write(char* logline) {
    m_stream << logline << endl;
}

Log::~Log() {
    m_stream.close();
}

Думаю, пояснений это никаких не требует, к тому же предназначение всех функций было разъяснено выше.

Этот класс очень помогает при отладке. Теперь стоит продемонстрировать пример, как он может использоваться в проекте:

#include <cstdlib>
#include "log.h"

int main(int argc, char** argv) {
    Log *pLog = new Log("errors.log");
    pLog->Write("Going into our loop");
    for(int i = 0; i < 10; i++){
        char c[50];
        sprintf(c, "Looped: %d times", i);
        pLog->Write(c);
    }
    return 0;
}

Для добавления значения переменных, как было показано выше, можно использовать sprintf.
Это далеко не единственный способ, тут уж кто на что горазд. Наиболее рациональный способ — это использование Write с va_list (c переменным числом аргументов):

pLog->Write("Looped: %d times!", i); // no sprintf needed!

Для этого, соответственно, необходимо написать функцию с переменным числом аргументов (variadic function):

#include <stdarg.h>
#include <log.h>

void Log::Write(const char* logline, ...) {
    va_list argList;
    char cbuffer[1024];
    va_start(argList, logline);
    vsnprintf(cbuffer, 1024, logline, argList);
    va_end(argList);
    m_stream << cbuffer << endl;
}

Этот класс представляет лишь основную идею, вы можете модифицировать его под свои потребности, добавляя новые, необходимые вам, возможности.

Автор: Renzo

Источник

Поделиться

* - обязательные к заполнению поля