![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
-------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
Обрати внимание, на то, что std::uncaught_exception( ) срабатывает только если объект был создан внутри блока try, иначе он не вызывается. С Builderoм STL нормально работает... |
|||
|
||||
_Tanatos_ |
|
||||||||||
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 20.11.2007 Репутация: нет Всего: нет |
Не знаю как нормально, но у меня не получилось добиться работы. Добавлено через 13 минут и 38 секунд Выкладываю на ваш суд черновой вариант классов Начну с вспомогательных структур:
Далее привожу класс CtLibLogEngine. Пока реализацию кинул в библиотечный файл, в будущем там останутся только inline функции
Смотрим вспомогательный класс CtLibLogHelper
А теперь пример использования:
Тут даже без макросов все довольно компактно получается. Имя функции и файла указываются только один раз. |
||||||||||
|
|||||||||||
_Tanatos_ |
|
|||
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 20.11.2007 Репутация: нет Всего: нет |
Из текущих задач:
- сделать код безопасным для многопоточных приложений - сделать глобальный объект указателем для поддержки DLL (при инициализации DLL надо соответственно инициировать указатель, а в основной программе соответственно создавать сам объект) - Разработать класс (образец) подписчик для записи журнала в файл - добавить раздельную нумерацию строк для потоков Высказывайте свои пожелания, предложения и критику |
|||
|
||||
_Tanatos_ |
|
||||
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 20.11.2007 Репутация: нет Всего: нет |
Примерно так выглядит класс записывающий данные в файл:
Пример использования
|
||||
|
|||||
UnrealMan |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
Хреново без макросов получается. Во-первых, необходимость всюду прописывать __LINE__ - это ж... Кроме того, отладочная информация по логике вещей должна выводиться в лог только в отладочной версии программы. И желательно, чтобы в неотладочной версии параметры, представляющие собой отладочную информацию, зря не вычислялись. Указание типа лога через константу - IMHO, не самая лучшая идея. Этот логгер неудобно будет использовать для вывода составных данных - когда строка формируется из подстрок, чисел и прочих данных с нужным форматированием. Придётся самому вычислять строку и передавать её логгеру - это как минимум громоздко. |
|||
|
||||
Lazin |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
Можно сделать так что-бы ф-я SubscriberAdd получала не указатель на ф-ю с модификатором __closure, а указатель на класс, а все "подписчики" имели-бы одинаковый интерфейс, это было-бы переносимо на другие компиляторы.
Этот класс не учитывает одного простого факта - что возможен запуск нескольких копий одного приложения, в этом случае в файле будет мусор. Нужно синхронизировать доступ к файлу, например создать именованный мьютекс и захватывать его пере записью, и выводить в лог код процесса, что-бы можно было различать вывод разных процессов.
Возможное решение этой проблеммы - использовать полиморфизм, передавать в объект logEngine объекты, содержащие нужную информацию. CtLibLogHelper может выступать в роли фабрики классов. Добавлено через 2 минуты и 29 секунд выглядеть это может так
|
||||
|
|||||
_Tanatos_ |
|
||||
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 20.11.2007 Репутация: нет Всего: нет |
Принято:
В класс входит только одна функция, так как пока не вижу что еще может потребоваться. Можно добавить туда же унифицированные функции настройки фильтра, аналогично классу Engine. Надо? Добавлено через 4 минуты и 24 секунды Не хочу чересчур усложнять класс, который должен работать максимально быстро. ИМХО это обходится крайне просто, при инициализации лога добавьте к имени файла идентификатор процесса. А если нужна паралельная запись в файл, то надо сделать отдельный класс для этой задачи Таких классов-обработчиков может быть много. Например для накопления сообщений и отсылки их по почте и т.д. В данном случае мой класс является лишь примером. Сначала закончу с ядром, а уж потом займусь переферией. Добавлено через 8 минут и 54 секунды
Совершенно непонятное заявление! Поясни, что тебе не нравится? Не нравятся константы, пишы числа, переменные, выражения, да что угодно - главное чтобы результат был signed char. А лучше всего напиши чем именно не нравится и для какой задачи тебе это не подходит. P.S. Не ленитесь подробней изложить свою мысль, ведь от этого напрямую зависит результат |
||||
|
|||||
_Tanatos_ |
|
|||
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 20.11.2007 Репутация: нет Всего: нет |
А как ты себе представляешь класс логгера должен форматировать твои данные? Мне кажется Вы на этот класс возлагаете не его задачи. И потом громоздкое и длинное сообщение будет неудобоваримым. А если речь идет о данных, то для них есть отдельное поле (см ниже). Как вспомогательный инструмент можно написать функцию аналогичную sprintf, но возвращающую указатель на готовую строку и вставлять эту конструкцию вместо сообщения: LogHelper.Message(lltInfo, Format(" Этап №%d", Number), "", __LINE__); Годится такой вариант? Опять же непонятно зачем полиморфизм и причем тут фабрика классов? Приведенный тобой пример вполне подходит для формирования поля Data, если вызов функции AddValue будет приводить к добавлению строчки с именем переменной и ее значением. Если так, то согласен и постараюсь добавить несколько функций для работы с различными типами данных. Только проблема заключается в том, что надо будет так же добавлять функцию Post() в конце для определения момента когда сообщение полностью сформированно и его надо передать в класс Engine. |
|||
|
||||
UnrealMan |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
Так же, как это делают потоки типа fstream или хотя бы как fprintf.
Это не первостепенная задача логгера, но тут можно провести аналогию с файловыми потоками и простым сишным выводом через fprintf. Для того, чтобы записать текст в файл, можно воспользоваться строковым потоком или sprintf и для результата вызвать write/fwrite. Но вряд ли кто-то захочет так делать, потому что проще не вводить лишние звенья, а сразу воспользоваться оператором << файлового потока или fprintf. Это неудобный вариант. |
||||
|
|||||
_Tanatos_ |
|
|||
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 20.11.2007 Репутация: нет Всего: нет |
В вашем примере указано только одно поле, а их как минимум два Сообщение и данные.
Такой вариант приемлим?
P.S. To All: Спасибо всем, кто принимает участие в обсуждении! Стараюсь учесть пожелания и предложения каждого Сорри что изменения не так быстро воплощаются в код. P.S.S. Повторюсь, макросы пока не пишу так как они не сказываются на функциональности. Понятное дело, что с ними короче и удобней, понятно что они будут и это даже не обсуждается. Будут сделаны когда утоится состав и формат всех функций, так что не сердчайте на их отсутствие. Но! Если здесь писать все в виде макросов, то совершенно непонятно получается что должно быть внутри. Это сообщение отредактировал(а) _Tanatos_ - 29.11.2007, 12:45 |
|||
|
||||
_Tanatos_ |
|
|||
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 20.11.2007 Репутация: нет Всего: нет |
Не хочется изобретать велосипед и раз уж речь зашла о форматировании, то хотелось бы использовать sprintf.
Только как передать переменное кол-во аргументов дальше?
Уважаемые гуру, нужен Ваш совет! Писать множество отдельных функций для различных типов данных ИМХО нелогично (что делать если надо сразу два аргумента передать при форматировании одной строки?). |
|||
|
||||
UnrealMan |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
||||
|
||||
UnrealMan |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
Добавлено через 3 минуты и 32 секунды Есть одно маленькое "но": теперь тебе придётся помнить о возможности переполнения буфера, используемого для sprintf. Это сообщение отредактировал(а) UnrealMan - 29.11.2007, 14:05 |
|||
|
||||
_Tanatos_ |
|
||||||||
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 20.11.2007 Репутация: нет Всего: нет |
Спасибо!
Сообщение от данных отделяю, для удобства. Данных может быть много, но при беглом просмотре лога они лишь отвлекают глаз. В сообщении содержится короткое сообщение по сути. В данных абсолютно все что угодно, что может быть полезным для отладки или даже можно написать подсказку для юзера ![]() Вот пример использования:
У меня получилось немного иначе, так как при многократном вызове нужно сохранять предыдущую часть. Ну и требования по длинне сообщения смегчаются ![]() Так выглядит содержимое функции:
И парочку сервисных функций:
Естественно добавился вызов ExReset() в деструктор ![]() Еще добавилось два конструктора:
для инициализации класса без создания сообщения в конструкторе. Это сообщение отредактировал(а) _Tanatos_ - 29.11.2007, 15:01 |
||||||||
|
|||||||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |