...

пятница, 7 июня 2013 г.

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

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

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

Допустим, вы заинтересовались вопросом и у вас уже созданы файлы 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;
}




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

This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends: 'You Say What You Like, Because They Like What You Say' - http://www.medialens.org/index.php/alerts/alert-archive/alerts-2013/731-you-say-what-you-like-because-they-like-what-you-say.html


Комментариев нет:

Отправить комментарий