LINUX.ORG.RU

Logger on C++


0

0

Здраствуйте.

Хочу создать свою "систему логгирования".

В двух файлах к примеру Logger.cpp и Logger.h описанна реализация класса class Logger. Пример использования прост. Logger l; l << "log message";

Но вот беда - мне не хочется постоянно писать Logger l, я хочу как с std::cout/cin/cerr то есть сразу log::mess << "message"; или log::cerr << "error";

Надеюсь понятно объяснил. Теперь вопрос - как(не отправляйте читать книжку, читал - не нашел)?

Спасибо.

Приблизительно так:
---Logger.h---
namespace log {
// Определение класса Logger
... 

	namespace {
		Logger& mess = Logger::getMessInstance(...);
		Logger& cerr = Logger::getStderrInstance();
		Logger& file = Logger::getFileInstance(...);
	}
}
---Logger.h---

Ну как бы ясно что Logger должен иметь статические члены для этого. Помимо того подумай с чем будет линковаться *.cpp в котором ты будешь определять собственно создаваемые логгеры. %)

PS. Подумай еще зачем тебе столько разных логгеров. И не надо ли их как-то объеденить (+ уровень логгирования %)))

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

Спасибо. Насчет подумать. Мне нужно только два уровня - обычный лог, и лог ошибок. Я не очень понимаю зачем их надо объединить + уровень логирования? Чем плоха такая задумка? Если я некорректно "задумал", то предложите пожалуйста как можно лучше(исходя из критериев удобочитаемости и простоты)?

>Помимо того подумай с чем будет линковаться *.cpp в котором ты будешь определять собственно создаваемые логгеры. %)

Вы не могли бы здесь попродробнее? что значит линковаться *.cpp?

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

Да и ещё :
Logger.h:21: error: syntax error before `::' token
Logger.h:21: error: `my_log::<unnamed>::mess' declared as reference but not
   initialized
Logger.h:22: error: syntax error before `::' token
Logger.h:22: error: `my_log::<unnamed>::cerr' declared as reference but not
   initialized


19    namespace
20    {
21        Logger& mess = Logger::getmess ( const std::string &mess );
22        Logger& cerr = Logger::getcerr ( const std::string &cerr );
23    }


Что я не так понял?

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

Извиняюсь. Полностью :

namespace my_log
{

    class Logger
    {
        public:
            static Logger& getmess ( const std::string &mess ) { std::cout << mess << std::endl; }
            static Logger& getcerr ( const std::string &cerr ) { std::cerr << cerr << std::endl; }
        private:
            static std::ofstream file_log;
    };

    namespace
    {
        Logger& mess = Logger::getmess ( const std::string &mess );
        Logger& cerr = Logger::getcerr ( const std::string &cerr );
    }

}

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

static Logger& getmess .. после } двоеточие стоит. т в getcerr тоже.

Не пинайте сильно, я просто ничего найти по данной теме не смог, поэтому пишу всякую чушь. Если можно пример или ссылку.

anotherLinuxUser
() автор топика

Я бы сделала так:

class Logger {
Logger *log;
public:
static Logger& getInstance() {
if (log == NULL) {
log = new Logger();
}
return *log;
}
};

при этом у нас есть расшаренный инстанс логера, например для записи
в common log file + остается возможность создавать локальные
объекты.

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

Спасибо. Как вариант интерсно. "остается возможность создавать локальные объекты." вот только зачем? И потом я бы все равно сначала хотел бы реализовать то, что задумал(хотя бы в целях получше изучить С++).

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

Допустим какой то модуль захочет писать в отдельный лог файл.

Еще может пригодится возможность прикреплять к loggeru несколько

потоков вывода, например один потоков пишет на консоль, другой в файл

и т.д.

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