Класс для ведения лога на 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; } 

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

ссылка на оригинал статьи http://habrahabr.ru/post/182452/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *