Форум программистов, компьютерный форум CyberForum.ru

Потоки вывода - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
20.11.2010, 00:46     Потоки вывода #1
Даже не знаю как правильно сформулировать, но хотел сделать примерно следующее и вошел в ступор.

Как создать класс, который смог бы привязаться к потокам cout/clog/cerr по выбору пользователя?
То есть примерный вид использования был бы таким:
Код
MyClass mc(std::cout);
mc.write("this message");
То есть итоговая задача состоит в написании простейшего логгера со следующей архитектурой.
Message:
Содержит следующие данные
+ content - содержимое сообщения
+ level - приоритет
+ type - тип

Logger:
Отвечает за вывод данных

LogManager:
Управляет сообщениями и потоками,
Фильтрует сообщения по типу и приоритету и направляет в нужный Logger.

Вот начал было реализовывать класс Logger и запнулся
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.11.2010, 00:46     Потоки вывода
Посмотрите здесь:

C++ Вопрос про потоки вывода
C++ потоки ввода/вывода.
Потоки ввода-вывода в С++ C++
C++ Используя потоки ввода/вывода в С++
C++ Текстовые файлы и потоки ввода/вывода
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
20.11.2010, 00:52     Потоки вывода #2
можно держать в классе std::ostream*
инициализировать MyClass mc(&std::cout);
так и потоки ввода-вывода, файлы работать будут, пробовал
ссылкой на поток вроде как не удастся обойтись
tartikov
Заблокирован
20.11.2010, 00:54     Потоки вывода #3
Цитата Сообщение от alex_x_x Посмотреть сообщение
можно держать в классе std::ostream*
а почему бы не std::ostream& ?
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
20.11.2010, 00:56     Потоки вывода #4
Цитата Сообщение от tartikov Посмотреть сообщение
а почему бы не std::ostream& ?
с указателем можно будет использовать все производные классы
tartikov
Заблокирован
20.11.2010, 00:57     Потоки вывода #5
Цитата Сообщение от alex_x_x Посмотреть сообщение
с указателем можно будет использовать все производные классы
LOL, а с ссылкой будто нет)
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
20.11.2010, 01:01     Потоки вывода #6
видимо будет
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
20.11.2010, 01:04  [ТС]     Потоки вывода #7
Цитата Сообщение от tartikov Посмотреть сообщение
LOL, а с ссылкой будто нет)
Ссылка не может быть не инициализированной.

Такой еще вопрос, если использовать вывод в файлы, то мне не хотелось бы создавать файлы вне класса logger. А так как управлять логгерами я планировал только через менеджер, то нормальным ли решением будет создать два вида логгеров (для консоли и файлов), а в менеджере сделать две функции для создания логгеров:
C++
1
2
void add_logger(string name);
void add_logger(ostream *os);
и в каждой создавать определенного типа.

Естественно сделать базовый logger и два дочерних console_logger и file_logger.
tartikov
Заблокирован
20.11.2010, 01:05     Потоки вывода #8
Цитата Сообщение от alex_x_x Посмотреть сообщение
видимо будет
а зачем тогда указатель?

правка: fasked, уже ответил
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
20.11.2010, 01:07     Потоки вывода #9
Цитата Сообщение от fasked Посмотреть сообщение
Ссылка не может быть не инициализированной.
ну вот единственно вопрос, что поток будет жестко привязан
fasked, поясни как примерно логирование будет выглядеть, а то не совсем представляю
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
20.11.2010, 01:11  [ТС]     Потоки вывода #10
Цитата Сообщение от alex_x_x Посмотреть сообщение
поясни как примерно логирование будет выглядеть, а то не совсем представляю
Пользователь с помощью менеджера заранее создает нужные логгеры (можно несколько), настраивает менеджер определенным образом (например задает минимальный приоритет логгируемых сообщений), в общем настраивает фильтрацию. Затем передает в менеджер сообщение и менеджер сам определяет посылать ли это сообщение в логгер и в какой логгер.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
20.11.2010, 01:17     Потоки вывода #11
fasked, в любом случае не стоит привязвать менеджера к конкретным типам логгеров. Создай абстрактный класс описывающий интерфейс логгера, менеджер будет "общатся" с логгерами исключительно через него. Не стоит на менеджера возлагать слишком многого. Создание конкретных логгеров лучше возложить на другой объект.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
20.11.2010, 01:25  [ТС]     Потоки вывода #12
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Создай абстрактный класс описывающий интерфейс логгера, менеджер будет "общатся" с логгерами исключительно через него.
Ну это понятное дело, в конце концов это пришлось бы сделать из-за проблемы хранения логгеров, учитывая их динамически изменяющееся количество.
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Не стоит на менеджера возлагать слишком многого. Создание конкретных логгеров лучше возложить на другой объект.
А вот тут можно поподробнее? Допустим создать еще один тип-строитель, который будет отвечать за создание логгеров. Но кто им будет управлять? Сам пользователь или опять же менеджер?
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
20.11.2010, 01:30     Потоки вывода #13
fasked, все зависит от того, кто, зачем и когда нуждается в логировании. Нужно больше информации о клиентах система логирования.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.11.2010, 02:28     Потоки вывода
Еще ссылки по теме:

Потоки ввода-вывода C++
C++ потоки вывода
C++ Непонятная ошибка. Потоки ввода/вывода

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
20.11.2010, 02:28  [ТС]     Потоки вывода #14
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
все зависит от того, кто, зачем и когда нуждается в логировании. Нужно больше информации о клиентах система логирования.
Конечным клиентом будет приложение, в логах будут отражаться различные события, касающиеся работы этого приложения. Как минимум в лог будут записываться результаты предварительного тестирования (ссылка на прошлую мою тему ), то есть, исходя из данных логов, будет осуществляться поиск заваленных тестов. Пока что это единственная реально существующая задача для системы логгирования, но в будущем в логи будут добавляться и другие события для осуществления мониторинга действий пользователя и ошибок приложения.
Yandex
Объявления
20.11.2010, 02:28     Потоки вывода
Ответ Создать тему

Метки
вывод, потоки
Опции темы

Текущее время: 21:09. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru