Re: корректный и быстрый логгинг
От: remark Россия http://www.1024cores.net/
Дата: 07.11.06 18:46
Оценка: +1
Здравствуйте, Graf Alex, Вы писали:

GA>Пару вопросов по сабжу...

GA>В общем нужно в релизной сборке иметь возможность (по какому нибудь ключу из коммандной строки) детального лога работы программы. При этом в случае, если лог отключен что бы это все не сильно тормозило...

GA>Сейчас информация для лога готовится в любом случае, а потом если надо постится в консоль. Логично, что имеются некоторые неоправданные задержки в режиме, когда логгинг не нужен...


GA>Вариант второй:

GA>Вводим где нибудь флажок, что логгинг включен. В зависимости от этого флага собственно делаем логгинг или нет....

GA>Какие есть еще соображения по этому поводу?


GA>ЗЫ Платформа — Юникс



Я делаю так:

#define LOG if (!need_logging());get_log_stream()
LOG << "x = " << get_x();


Очень удобно и быстро.
Главное отоптимизировать функцию need_logging(). Т.к. когда логирование выключено будет проверяться только она, никакого форматирования и вычисления никаких функций не будет

.

1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
корректный и быстрый логгинг
От: Graf Alex Украина http://grafalex.oberon.kiev.ua
Дата: 07.11.06 10:58
Оценка:
Пару вопросов по сабжу...
В общем нужно в релизной сборке иметь возможность (по какому нибудь ключу из коммандной строки) детального лога работы программы. При этом в случае, если лог отключен что бы это все не сильно тормозило...

Сейчас информация для лога готовится в любом случае, а потом если надо постится в консоль. Логично, что имеются некоторые неоправданные задержки в режиме, когда логгинг не нужен...

Вариант первый:
Пихаем все всю логику в dll-ку, собираем 2 либы — с логингом и без него. В зависимости от ключа используем либо одину, либо вторую.
Тут трудности в реализации динамического подключения, да и время сборки в 2 раза больше...

Вариант второй:
Вводим где нибудь флажок, что логгинг включен. В зависимости от этого флага собственно делаем логгинг или нет....

Какие есть еще соображения по этому поводу?

ЗЫ Платформа — Юникс
Re: корректный и быстрый логгинг
От: Андрей Коростелев Голландия http://www.korostelev.net/
Дата: 07.11.06 12:00
Оценка:
Здравствуйте, Graf Alex, Вы писали:

GA>Пару вопросов по сабжу...

GA>В общем нужно в релизной сборке иметь возможность (по какому нибудь ключу из коммандной строки) детального лога работы программы. При этом в случае, если лог отключен что бы это все не сильно тормозило...

GA>Какие есть еще соображения по этому поводу?


Лучше настраивать логгер через конфигурацинный файл. Этот файл может содержать такие параметры логгинга как:

Логгинг будет выключен если либо в конфиге выставлен off, либо если конфигурационный файл отсутствует.
-- Андрей
Re[2]: корректный и быстрый логгинг
От: Graf Alex Украина http://grafalex.oberon.kiev.ua
Дата: 07.11.06 13:39
Оценка:
Здравствуйте, Андрей Коростелев, Вы писали:

АК>Здравствуйте, Graf Alex, Вы писали:


GA>>Пару вопросов по сабжу...

GA>>В общем нужно в релизной сборке иметь возможность (по какому нибудь ключу из коммандной строки) детального лога работы программы. При этом в случае, если лог отключен что бы это все не сильно тормозило...

GA>>Какие есть еще соображения по этому поводу?


АК>Лучше настраивать логгер через конфигурацинный файл. Этот файл может содержать такие параметры логгинга как:

АК>
АК>Логгинг будет выключен если либо в конфиге выставлен off, либо если конфигурационный файл отсутствует.

Не, ну это все понятно.... Оно в принципе так и работает, логгинг многоуровневый, да еще и по модулям...

Вопрос был как это лучше в коде оформить?
Re[2]: корректный и быстрый логгинг
От: Ka3a4oK  
Дата: 07.11.06 20:39
Оценка:
R>
R>#define LOG if (!need_logging());get_log_stream()
R>LOG << "x = " << get_x();
R>


Зачем ; после (!need_logging()) ?
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[3]: корректный и быстрый логгинг
От: Roman Odaisky Украина  
Дата: 07.11.06 21:47
Оценка:
Здравствуйте, Ka3a4oK, Вы писали:

R>>
R>>#define LOG if (!need_logging());get_log_stream()
R>>LOG << "x = " << get_x();
R>>


KK>Зачем ; после (!need_logging()) ?


http://www.rsdn.ru/Forum/Message.aspx?mid=1853866
Автор: remark
Дата: 18.04.06


В двух словах:
if(C) X
эквивалентно
if(!C) ; else X
...кроме одной детали:
#define A if(C) X
#define B if(!C) ; else X

if(whatever)
    A << "oops";
else
    f();

if(whatever)
    B << "oops";
else
    f();

// и получится:

if(whatever)
    if(C)
        X << "oops";
    else
        f(); // вот вам и упс, это предназначалось к другому if!

if(whatever)
    if(!C)
        ;
    else
        X << "oops";
else
    f();

P. S. Фигурные скобки a la Perl (т. е. везде) рулят.
До последнего не верил в пирамиду Лебедева.
Re[4]: корректный и быстрый логгинг
От: Ka3a4oK  
Дата: 07.11.06 22:15
Оценка:
RO>В двух словах:
RO>
if(C) X
эквивалентно
if(!C) ; else X
...кроме одной детали:

RO>[c]

А где else ?
... << RSDN@Home 1.1.4 stable rev. 510>>
Re: корректный и быстрый логгинг
От: Dronzo  
Дата: 08.11.06 07:40
Оценка:
Здравствуйте, Graf Alex, Вы писали:

GA>Пару вопросов по сабжу...


GA>Вариант первый:

GA>Пихаем все всю логику в dll-ку, собираем 2 либы — с логингом и без него. В зависимости от ключа используем либо одину, либо вторую.
GA>Тут трудности в реализации динамического подключения, да и время сборки в 2 раза больше...

GA>Какие есть еще соображения по этому поводу?


GA>ЗЫ Платформа — Юникс


Может быть будет интересно посмотреть http://logging.apache.org/ ? Порт на C++ я не смотрел, ограничившись .net'ом, но быть может это то, что вы ищите.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: корректный и быстрый логгинг
От: nen777w  
Дата: 08.11.06 08:08
Оценка:
Я бы сделал так:
Определяешь две варианта ф-ции логинга первая делает сове дело вторая просто фиктивная, при запуске устанавливаешь поинтер на ф-цию, на нужную тебе ф-цию
Re[2]: корректный и быстрый логгинг
От: remark Россия http://www.1024cores.net/
Дата: 08.11.06 08:16
Оценка:
Здравствуйте, nen777w, Вы писали:

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

N>Определяешь две варианта ф-ции логинга первая делает сове дело вторая просто фиктивная, при запуске устанавливаешь поинтер на ф-цию, на нужную тебе ф-цию

Это не спасёт от вычисления аргументов функции!


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re: корректный и быстрый логгинг
От: Alex34 Израиль  
Дата: 08.11.06 09:09
Оценка:
Советую просмотреть Logging Service в ACE :
мулти платформенность
возможность управлять и перенаправлять output.
фильтрация по severity на уровне процесса или потока
И еще много чего


линк : http://www.awprofessional.com/articles/article.asp?p=169524&amp;rl=1
Re: корректный и быстрый логгинг
От: MaximE Великобритания  
Дата: 08.11.06 12:11
Оценка:
Graf Alex wrote:

> Пару вопросов по сабжу...

> В общем нужно в релизной сборке иметь возможность (по какому нибудь
> ключу из коммандной строки) детального лога работы программы. При этом в
> случае, если лог отключен что бы это все не сильно тормозило...
>
> Сейчас информация для лога готовится в любом случае, а потом если надо
> постится в консоль. Логично, что имеются некоторые неоправданные
> задержки в режиме, когда логгинг не нужен...
>
> Вариант первый:
> Пихаем все всю логику в dll-ку, собираем 2 либы — с логингом и без него.
> В зависимости от ключа используем либо одину, либо вторую.
> Тут трудности в реализации динамического подключения, да и время сборки
> в 2 раза больше...
>
> Вариант второй:
> Вводим где нибудь флажок, что логгинг включен. В зависимости от этого
> флага собственно делаем логгинг или нет....
>
> Какие есть еще соображения по этому поводу?

Часто удобно иметь возможность включить или повысить детальность логгинга в
рантайм. Лучше способа, чем if(flag) ... пока не видел. Для удобства можно
обернуть if в макросы (правильные C99 макросы с переменным числом аргументов,
http://gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/Variadic-Macros.html#Variadic-Macros)

#define LOG_DETAIL_DO_LOG(lg, lvl, ...) 
                                           \
do { if((lg).does_accept(lvl))                                       \
     (lg)(__FILE__, sizeof __FILE__ - 1, __LINE__, lvl, __VA_ARGS__); \
} while(0)

#define LOG_DBG(lg, ...)  LOG_DETAIL_DO_LOG(lg, logging::log_dbg,  __VA_ARGS__)
#define LOG_INFO(lg, ...) LOG_DETAIL_DO_LOG(lg, logging::log_info, __VA_ARGS__)
#define LOG_WARN(lg, ...) LOG_DETAIL_DO_LOG(lg, logging::log_warn, __VA_ARGS__)
#define LOG_ERR(lg, ...)  LOG_DETAIL_DO_LOG(lg, logging::log_err,  __VA_ARGS__)

// usage

LOG_DBG(log, "Hello world.");
LOG_DBG(log, "%s %s %s!", "Hello". "world", "again");


--
Maxim Yegorushkin

No Microsoft product was used in any way to write or send this text.
If you use a Microsoft product to read it, you're doing so at your own risk
Posted via RSDN NNTP Server 2.0
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.