Войти
Подсказки

Ведение log файлов.

Автор:

Часто при создании игровых движков разработчики сталкиваются с ошибками. Когда не знаешь где эта ошибка произошла, приходится пересматривать весь код и искать эту злосчастную ошибку. Порой это занимает много времени, а если количество файлов очень много, то это просто катастрофа. К счастью люди додумались вести логи о работе программы.

Лог - краткое сообщение о каком-либо действии.

Вот простой файл лога:


Создание окна... Успешно
Инициализация OpenGL... успешно
Закрытие окна.. успешно
Программа закончила работу

Этот лог для программы, в которой кроме инициализации OpenGL нет ничего. Но в логах можно вести записи о успешной загрузке текстур, о разрешении окна, да много о чём! Даже банальное "Hello World!"

Также очень удобно перед записью сообщения писать дату и время до секунд, чтобы узнать сколько времени у тебя программа загружается.

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

Вот пример реализации записи логов в HTML виде:

#ifndef __Screamer
#define __Screamer

#include <StdIo.H>
#include <StdLib.H>
#include <StdArg.H>
#include <String.H>
#include <FStream.H>

#define OutputFile      "Log.html"                                      
#define Log     Message()                                                               


class Screamer
{
private:
        fstream LogFile;                                                                
        char *HTML;
        char *PrevHTML;

        Screamer()                                                                              
        {
        LogFile.open(OutputFile,ios::out);
        LogFile.close();

        HTML = (char*) calloc(256,sizeof(char));
        PrevHTML = (char*) calloc(256,sizeof(char));

        WriteCode("<Title>Log File</Title>");
        WriteCode("<Html> <Body BgColor = Cornsilk>");
        WriteCode("<B><Font Size = 3 Color = DarkBlue Face = Verdana>Файл лога </B><BR>");
        }

public:
        ~Screamer()
        {
        WriteCode("</Font> </P> </Body> </Html>");
        free (PrevHTML);
        free (HTML);
        }
        
        void Write(const char* Color, const char *String, ...);
        void WriteBold(const char* Color, const char *String, ...);
        void WriteCode(const char *String);
        void WriteLine(); 
        friend Screamer& Message();                                             
};

inline void Screamer::Write(const char* Color, const char *String, ...)
{
        if (!String) return;
        
        char LogText[1024];
        
        va_list Print;                                                                  

        va_start(Print, String);
            vsprintf(LogText, String, Print);                   
        va_end(Print);
        
        LogFile.open(OutputFile,ios::app);

        strcat(HTML,"<Font Size = 2 Color = ");                 
        strcat(HTML,Color);                                                             
        strcat(HTML," Face = Verdana>");                                

        time_t ltime;
        time( <ime );
        char *mtime=ctime( <ime );
        mtime[strlen(mtime)-1]=0;

        if (strcmp(PrevHTML,HTML)!=0)                                   
        {
                strcpy(PrevHTML,HTML);                                          
                LogFile<<"</Font>"<<endl;                                       
                LogFile<<HTML<<endl;                                            
                *HTML=NULL;                                                                     
        }

        LogFile<<"<BR>"<<mtime<<" "<<LogText<<endl;                             
        LogFile.close();
}

inline void Screamer::WriteBold(const char* Color, const char *String, ...)
{
        if (!String) return;
        
        char LogText[1024];
        
        va_list Print;                                                          

        va_start(Print, String);
            vsprintf(LogText, String, Print);           
        va_end(Print);
        
        WriteCode("<B>");
        Write(Color,String);
        WriteCode("</B>");
}


inline void Screamer::WriteCode(const char *String)
{
        LogFile.open(OutputFile,ios::app);
        LogFile<<String<<endl;
        LogFile.close();
}

inline Screamer& Message()
{
        static Screamer SingleObject;                           
        return SingleObject;
}

#endif

Как видите реализация такой важной штуки, как ведение логов, не очень сложна и каждый может сделать что-то подобное. Надеюсь этот небольшой tip поможет вам!

7 июня 2003