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

Повышение удобочитаемости лог-файлов

Автор:

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

Для небольшого улучшения ситуации попробуем идентифицировать каждую запись именем файла где она содержится, и номером строки в этом файле. Для этого можно использовать предопределенные макросы __LINE__ и __FILE__ которые возвращают соответственно: номер строки в cpp файле, где произошёл вызов этого макроса, и полный путь и имя этого файла.  В большинстве (или во всех?) лог-системах добавление строки в файл осуществляется вызовом процедуры аналогичной: void AddLine(char *Msg, ...). Завернем эту процедуру и вышеописаные макросы в удобную упаковочку.

#define LOGMSG(logMsg) AddLine("%-15s %5d:  %-1s",ExtractFileName(__FILE__).data() ,__LINE__ ,logMsg)

Так как полный путь к файлу в логе смотрится не очень красиво, то с помощью функции ExtractFileName() "выкусываем" только имя файла+расширение:

typedef std::string aStr;

aStr ExtractFileName(aStr filename)
{
        if (filename.size() == 0) return "";

        int i = filename.size();
        aStr buf;
        while((filename[i] != '\\') && (i > 0))
        {
                buf = filename[i--] + buf;
        }
        return buf;
}

Использование просто: в нужном месте добавте LOGMSG("Важная запись"), и в лог файле получите: game.cpp 23: Важная запись.

Вот и все. В комбинации с Tip №12 "Ведение лог файлов" товарища irek'а получаются довольно красивые результаты.

29 августа 2003