Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> помогите разобраться с logger'ом, создает файл, но ничего туда не печатает 
V
    Опции темы
JanryMayers
Дата 8.5.2011, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 11.6.2009
Где: Украина, г. Киев

Репутация: нет
Всего: нет



Всем, привет.

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

*.h
Код

#ifndef _log_h
#define _log_h
#include <fstream>
#include <vector> 
#include <string> 

enum EMessageLevel
{
    LM_ERROR = 0,
    LM_WARNING = 1,
    LM_LOG = 2,
    LM_INFO = 3,

    LM_MAX,
    LM_NONE
};

class Logger 
{ 
private: 
    static std::vector<std::string> hLogQueue; 
    static const char* hLogPath; 
    static std::ofstream LogFile;
   
public: 
    static int logStatus;
    static void Initialize(); 
    static void Process(); 
    static std::string getFileName(const char*);
    static void Logging(const std::string& message, EMessageLevel level);
}; 

class LoggerOperator
{
public:
    LoggerOperator( const char * _file, EMessageLevel _level );

public:
    void operator()( const char* _message, ... );

protected:
    const char * m_file;
    EMessageLevel m_level;
};

#    define LOG_ERROR\
    LoggerOperator( __FILE__, LM_ERROR )

#    define LOG_WARNING\
    LoggerOperator( __FILE__, LM_WARNING )

#    define LOG\
    LoggerOperator( __FILE__, LM_LOG 

#    define LOG_INFO\
    LoggerOperator( __FILE__, LM_INFO)

#endif


*.cpp
Код

#include "log.h"

#pragma warning(disable : 4996)

#include <stdarg.h>
#include <Windows.h>

std::vector<std::string> Logger::hLogQueue; 
const char* Logger::hLogPath = "Data\\log\\"; 
int Logger::logStatus = LM_MAX;
std::ofstream hLogFile;

void Logger::Initialize()
{ 
    std::string LogFileName = getFileName(hLogPath);
    const char* lpstrLogFile = LogFileName.c_str();
    hLogPath = !lpstrLogFile ? "console.log" : lpstrLogFile;
    hLogFile.open(hLogPath); 
    hLogFile.close(); 
} 

std::string Logger::getFileName(const char* filePath)
{                
    SYSTEMTIME mTime;
    GetSystemTime(&mTime);
    char* s = new char;
    std::string year = itoa(mTime.wYear,s,10);
    std::string month = itoa(mTime.wMonth,s,10);
    std::string day = itoa(mTime.wDay,s,10);
    std::string mDate = day + "_" + month + "_" + year;
    std::string fileName(filePath + mDate + "_log.txt");
    return fileName;
}

void Logger::Process() 
{ 
   if(!hLogQueue.size()) 
   { 
      return; 
   } 

   hLogFile.open(hLogPath);

   for(size_t t = 0; t < hLogQueue.size(); t++) 
   { 
      hLogFile << hLogQueue[t]; 
   } 
   hLogFile.close(); 
   hLogQueue.clear(); 
} 

void Logger::Logging(const std::string& message, EMessageLevel level) 
{ 
    if (logStatus == LM_NONE) return;

    if(level<logStatus) 
    { 
        hLogQueue.push_back(message + "\n"); 
    } 
        Process(); 

}

LoggerOperator::LoggerOperator( const char * _file, EMessageLevel _level )
    : m_file( _file )
    , m_level( _level )
{

}

void LoggerOperator::operator()(const char* logline, ...){
    va_list argList;

    va_start(argList, logline);

    char str[1024];

    vsprintf( str, logline, argList );

    va_end(argList);

    Logger::Logging(logline, m_level);
}



вызываю - LOG_INFO("Help!");
PM MAIL   Вверх
asmdzen
Дата 8.5.2011, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: нет
Всего: 5



std::ofstream hLogFile; - std::ofstream logger::LogFile; ?

Это сообщение отредактировал(а) asmdzen - 8.5.2011, 19:22
PM MAIL   Вверх
JanryMayers
Дата 8.5.2011, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 11.6.2009
Где: Украина, г. Киев

Репутация: нет
Всего: нет



спс за замечание).
Вот исправил таким образом.
Код

#ifndef _log_h
#define _log_h
#include <fstream>
#include <vector> 
#include <string> 

enum EMessageLevel
{
    LM_ERROR = 0,
    LM_WARNING = 1,
    LM_LOG = 2,
    LM_INFO = 3,

    LM_MAX,
    LM_NONE
};

class Logger 
{ 
private: 
    static std::vector<std::string> hLogQueue; 
    static const char* hLogPath; 
   
public: 
    static int logStatus;
    static void Initialize(); 
    static void Process(); 
    static std::string getFileName(const char*);
    static void Logging(const std::string& message, EMessageLevel level);
}; 

class LoggerOperator
{
public:
    LoggerOperator( const char * _file, EMessageLevel _level );

public:
    void operator()( const char* _message, ... );

protected:
    const char * m_file;
    EMessageLevel m_level;
};

#    define LOG_ERROR\
    LoggerOperator( __FILE__, LM_ERROR )

#    define LOG_WARNING\
    LoggerOperator( __FILE__, LM_WARNING )

#    define LOG\
    LoggerOperator( __FILE__, LM_LOG 

#    define LOG_INFO\
    LoggerOperator( __FILE__, LM_INFO)

#endif

Код

#include "log.h"

#pragma warning(disable : 4996)

#include <stdarg.h>
#include <Windows.h>

std::vector<std::string> Logger::hLogQueue; 
const char* Logger::hLogPath = "Data\\log\\"; 
int Logger::logStatus = LM_MAX;

void Logger::Initialize()
{ 
    std::string LogFileName = getFileName(hLogPath);
    const char* lpstrLogFile = LogFileName.c_str();
    hLogPath = !lpstrLogFile ? "console.log" : lpstrLogFile;
    std::ofstream hLogFile(hLogPath);
    hLogFile.close(); 
} 

std::string Logger::getFileName(const char* filePath)
{                
    SYSTEMTIME mTime;
    GetSystemTime(&mTime);
    char* s = new char;
    std::string year = itoa(mTime.wYear,s,10);
    std::string month = itoa(mTime.wMonth,s,10);
    std::string day = itoa(mTime.wDay,s,10);
    std::string mDate = day + "_" + month + "_" + year;
    std::string fileName(filePath + mDate + "_log.txt");
    return fileName;
}

void Logger::Process() 
{ 
   if(!hLogQueue.size()) 
   { 
      return; 
   } 

   std::ofstream hLogFile(hLogPath,std::ios::app);

   for(size_t t = 0; t < hLogQueue.size(); t++) 
   { 
      hLogFile << hLogQueue[t]; 
   } 
   hLogFile.close(); 
   hLogQueue.clear(); 
} 

void Logger::Logging(const std::string& message, EMessageLevel level) 
{ 
    if (logStatus == LM_NONE) return;

    if(level<logStatus) 
    { 
        hLogQueue.push_back(message + "\n"); 
    } 
    if(hLogQueue.size() >= 10) 
    { 
        Process(); 
    }
}


LoggerOperator::LoggerOperator( const char * _file, EMessageLevel _level )
    : m_file( _file )
    , m_level( _level )
{}

void LoggerOperator::operator()(const char* logline, ...){
    va_list argList;

    va_start(argList, logline);

    char str[1024];

    vsprintf( str, logline, argList );

    va_end(argList);

    Logger::Logging(logline, m_level);
}


PM MAIL   Вверх
asmdzen
Дата 9.5.2011, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: нет
Всего: 5



Цитата(JanryMayers @  8.5.2011,  20:06 Найти цитируемый пост)
Logger::Logging(logline, m_level);

первый параметр заменить на std::string(str)
PM MAIL   Вверх
Dem_max
Дата 9.5.2011, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



у тебя логгер под какую ОС ?


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
JanryMayers
Дата 9.5.2011, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 11.6.2009
Где: Украина, г. Киев

Репутация: нет
Всего: нет



Цитата

у тебя логгер под какую ОС ?

вообще win64 7, но я приложение собираю для win32. (msvc8)
Цитата

первый параметр заменить на std::string(str) 


не это не помогает


там дела в другом, предполагаю, что в функции Logger::Initialize() создается нужный мне файл, а когда я вызываю макрос для вывода информации, то в Logger::Process() открывается файл с именем, предположительно файла из которого был вызван макрос, те на имя файла  который передается сюда
Код

#    define LOG_ERROR\
    LoggerOperator( __FILE__, LM_ERROR )

#    define LOG_WARNING\
    LoggerOperator( __FILE__, LM_WARNING )

#    define LOG\
    LoggerOperator( __FILE__, LM_LOG 

#    define LOG_INFO\
    LoggerOperator( __FILE__, LM_INFO) 


параметром __FILE__,.

Это сообщение отредактировал(а) JanryMayers - 9.5.2011, 23:09
PM MAIL   Вверх
JanryMayers
Дата 10.5.2011, 01:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 11.6.2009
Где: Украина, г. Киев

Репутация: нет
Всего: нет



Вообщем разобрался в чем дело. В функции Logger::Process()

std::ofstream hLogFile(hLogPath,std::ios::app); - в hLogPath, приходит какой то мусор. Вопрос почему? И как грамотно реализовать обращение к hLogPath, что бы при инициализации создавался и прописывался путь и имя файла, а в Logger::Process() этот путь с именем того же файла использовался.
PM MAIL   Вверх
xvr
Дата 10.5.2011, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Ошибка тут -
Код

void Logger::Initialize()
{ 
    std::string LogFileName = getFileName(hLogPath);
    const char* lpstrLogFile = LogFileName.c_str();
    hLogPath = !lpstrLogFile ? "console.log" : lpstrLogFile;
    std::ofstream hLogFile(hLogPath);
    hLogFile.close(); 
} 
В строке 3 создается переменная LogFileName типа std::string. В строке 4 от нее зовется c_str(). В строке 5 результат c_str() присваивается в hLogPath. А при завершении метода Logger::Initialize локальная переменная LogFileName разрушается, и все, что было получено из нее через c_str() (в том числе и содержимое hLogPath) становится невалидно


Это сообщение отредактировал(а) xvr - 10.5.2011, 13:06
PM MAIL   Вверх
asmdzen
Дата 10.5.2011, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: нет
Всего: 5



Цитата(JanryMayers @  9.5.2011,  22:50 Найти цитируемый пост)
не это не помогает

вообщето помогает )
у меня все нормально пишет с таким кодом:
Код

void LoggerOperator::operator()(const char* logline, ...){
    va_list argList;
    va_start(argList, logline);
    char str[1024];
    vsprintf( str, logline, argList );
    va_end(argList);
    Logger::Logging(std::string(str), m_level);
}


Это сообщение отредактировал(а) asmdzen - 10.5.2011, 16:35
PM MAIL   Вверх
JanryMayers
Дата 15.5.2011, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 11.6.2009
Где: Украина, г. Киев

Репутация: нет
Всего: нет



странно почему c_str так работает... разве её данные нельзя никак скопировать?

я сделал так, но считаю что это неудачный вариант
Код

void Logger::Initialize()
{ 
    std::string LogFileName = getFileName(hLogPath);
    const char* lpstrLogFile = LogFileName.c_str();
    hLogPath = !lpstrLogFile ? "console.log" : lpstrLogFile;
    std::ofstream hLogFile(hLogPath);
    hLogFile.open(hLogPath);
    hLogFile.close(); 
} 



Это сообщение отредактировал(а) JanryMayers - 15.5.2011, 23:56
PM MAIL   Вверх
xvr
Дата 16.5.2011, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(JanryMayers @  15.5.2011,  23:47 Найти цитируемый пост)
странно почему c_str так работает.
Ничего странного, все логично. Результат, выданный ею не может пережить сам объект, который этот результат произвел.

Цитата(JanryMayers @  15.5.2011,  23:47 Найти цитируемый пост)
разве её данные нельзя никак скопировать?
Можно (выделяйте память под массив char'ов и копируйте туда), но не нужно. Просто сделайте ваш hLogPath типа std::string
 

Цитата(JanryMayers @  15.5.2011,  23:47 Найти цитируемый пост)
я сделал так, но считаю что это неудачный вариант

Это неправильный вариант. Он ничем не отличается от первоначального - hLogPath в вызове Logger::Logging() все так же будет указывать на мусор

PS. Ваш Logger имеет смысл сделать singleton'ом, а не полностью статическим классом, как он сделан сейчас

PM MAIL   Вверх
mrbrooks
Дата 16.5.2011, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 2
Всего: 306



JanryMayers, камрад - есть же кошерные логгеры с исходным кодом - вот к примеру. Уж если и есть жажда к велосипедо-строительству и не желание использовать готовые решения, кури их исходники. профита будет в разы больше.
PM MAIL   Вверх
JanryMayers
Дата 19.5.2011, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 11.6.2009
Где: Украина, г. Киев

Репутация: нет
Всего: нет



xvr, блин затупил, конечно там мусор... 

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

Это сообщение отредактировал(а) JanryMayers - 19.5.2011, 00:27
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0565 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.