LINUX.ORG.RU

Logger on C++ ... вроде все правильно ...


0

0

in Logger.h :

#ifndef CLASS_LOG_H
#define CLASS_LOG_H

#include <exception>
#include <iostream>
#include <fstream>
#include <time.h>

namespace Log
{
    class LoggerMess
    {
        public:
            LoggerMess():fileStr("LOG_MESS") {};
            ~LoggerMess() {};
            template<typename T>
            LoggerMess& operator << ( const T &mess )
            {
                try
                {
                    fileName.exceptions( std::fstream::failbit );
                    fileName.open ( fileStr.c_str(), std::ofstream::app );
                    fileName << mess;
                    fileName.close();
                }
                catch ( std::exception &e )
                {
                    std::cerr << "Exception caught: " << e.what() << std::endl;
                }
                return *this;
            };
            void setLogFile ( const std::string &Fset ) { fileStr = Fset; };
        private:
            std::ofstream fileName;
            std::string fileStr;
    };


    class LoggerCerr
    {
        public:
            LoggerCerr():fileStr("LOG_ERR") {};
            ~LoggerCerr() {};
            template<typename T>
            LoggerCerr& operator << ( const T &mess )
            {
                try
                {
                    fileName.exceptions( std::fstream::failbit );
                    fileName.open ( fileStr.c_str(), std::ofstream::app );
                    fileName << mess;
                    fileName.close();
                }
                catch ( std::exception &e )
                {
                    std::cerr << "Exception caught: " << e.what() << std::endl;
                }
                return *this;
            };
            void setLogFile ( const std::string &Fset ) { fileStr = Fset; };
        private:
            std::ofstream fileName;
            std::string fileStr;
    };

    extern LoggerMess mess;
    extern LoggerCerr cerr;
};

#endif

in  Logger.cpp
#include "Logger.h"

namespace Log
{
    LoggerMess mess;
    LoggerCerr cerr;
};

Используем так :
include "Logger.h"
int main ()
{
   Log::cerr << "error";
   Log::mess << "mess";
}

Скажите пожалуйста, где здесь ошибка? 
И что можно было бы исправить?
Спасибо
★★★

Компилить :
g++ -c main.cpp -I Logger_include/
g++ -c Logger.cpp -I Logger_include/
g++ -o main main.o Logger.o

fura13 ★★★
() автор топика
Ответ на: комментарий от aton

Ну странный вопрос. Зачем вообще нужны компоненты? Чтобы не изобретать велосипед (чем занялся автор треда).

hbee ★★★★
()

В плане ошибка? Вообще-то все работает... ;)

Ошибка в проектировании? Ну тогда как-бы первый корреспондент прав: довольно удобно в большинстве случаев пользоваться syslog-ом. Это не значит, что не можно обернуть его API в собственный класс. Это значит что тебе не надо думать как минимум о размере логов и пр. в общем о том, о чем думает syslog.

Повторюсь также: подумай об уровнях логгирования. (хотя зачем я это... Некоторые до этого досаточно долго доходили, может и другие пускай мучаются? %))) )

К последнему простой пример: представь себе, что есть у тебя проект. Не самый конечно большой проект, но такой уж и маленький... И вот наступил релиз не релиз, но что-то подобное. И ты понимаешь, что половина сообщений никого кроме разработчиков заинтересовать не может. Что делать будем? Варианты ответов: - удалять(комментировать) из исходных текстов лишние отепчатки; - все "лишнее" оборачивать в #ifdef ... к примеру _DEBUG; - варианты правильных ответов %);

hint: В неправильных, как минимум (даже если обертки #ifdef ты будешь писать с самого начала), придется перекомпилировать весь проект...

tarle
()
Ответ на: комментарий от hbee

Если это и компонета, то давольно отстойная, и годится только для тривиальных задачек... Кроме того как насчет кросс-платформы?

aton
()
Ответ на: комментарий от tarle

Т.е. приговор ффф топку? А еже ли переделать данный код не для записи в файл а для записи в syslog?

fura13 ★★★
() автор топика
Ответ на: комментарий от hbee

Может и существуют :) Но это уже перебор, из за такой мелочи как лог файл тащить за собой хрен знает что, и не фак что даром. Че там сложного то логгер написать? Пятиминутное дело (утрируя), и работать бедет как я хочу, а не как кто то придумал, и мне приходится с этим мириться.

aton
()
Ответ на: комментарий от anonymous

См. подшивку журнала "Программист" - ьам в одном из номеров был пример реализации логгера через syslog, но с интерфейсом ostream. Точно номер и год - не скажу, гугль тебе поможет. Как щас помню - ровно то, что ты тут хотел, только правильно написанное...

Flogger_d
()
Ответ на: комментарий от tarle

> И ты понимаешь, что половина сообщений никого кроме разработчиков заинтересовать не может. Что делать будем?

Это проблема, я её решил определённым образом, но проблемы остались.

Задача собственно действительно в том что по установленному DEBUG надо изменять поведение, отключать/включать логи. Я не вижу проблеммы в пересборке проекта, я вижу проблемму в том что везде надо ставить #ifdef DEBUG, красивее было бы ставить debug << "lkdfj"; а при сборке релиза логирование бы отключалось, Это просто сделать: шаблоны+частичная имплементация, когда определён DEBUG, сросто переопределяем операторы << на ничего не делание, компилятор должен оптимизировать вызовы пустых функций. Но возникают проблемы, связанные с тем что компилятор не совсем честен + переписывание уже сделанных << для простых типов. Я уже не говорю о проблемах реализиции логов в многопоточных приложениях. Я бы не сказал что проблемма логов в ++ простая. Я за свою деятельность сделал немеренное количество всяких примитивов, но меня не удовлетворяет моя реализация логов, не видел я достоенного экспоната и в чужих реализациях.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.