Я работаю над инфраструктурой ведения журнала отладки для серверного приложения. Каждая точка регистрации в исходном коде указывает свой уровень (CRITICAL, ERROR и т. Д.) Среди других параметров.
Таким образом, точка входа в исходный код выглядит так:
DBG_LOG_HIGH( … )
, который является макросом, который расширяется до
if ( CURRENT_DEBUG_LOG_LEVEL >= DEBUG_LOG_LEVEL_HIGH ) {
// prepare and emit log record
}
, где DEBUG_LOG_LEVEL_HIGH
- это предопределенная константа (скажем, 2), а CURRENT_DEBUG_LOG_LEVEL
- это некоторое выражение, которое оценивает текущий уровень ведения журнала отладки, установленный пользователем.
Простейшим подходом было бы определить CURRENT_DEBUG_LOG_LEVEL
как:
extern int g_current_debug_log_level;
#define CURRENT_DEBUG_LOG_LEVEL (g_current_debug_log_level)
Я хотел бы разрешить пользователю изменять текущий уровень ведения журнала отладки во время выполнения приложения, и это нормально, чтобы изменение вступило в силу через несколько секунд. Приложение является многопоточным, и изменения в g_current_debug_log_level
можно легко сериализовать (например, CRITICAL_SECTION
), но чтобы не влиять на производительность, выражение ( CURRENT_DEBUG_LOG_LEVEL >= DEBUG_LOG_LEVEL_HIGH )
должно выполняться как можно быстрее, поэтому я бы хотел избежать использования какого-либо потока Механизм синхронизации есть.
Итак, мои вопросы:
Может ли отсутствие синхронизации в чтениях g_current_debug_log_level
вызвать считывание неверного значения? Хотя это не должно влиять на корректность приложения, поскольку пользователь мог в любом случае установить текущий уровень ведения журнала отладки на неверное значение, это может повлиять на производительность приложения, поскольку это может привести к тому, что он будет генерировать очень большой объем журнала отладки в течение неуправляемого периода времени.
Гарантирует ли мое решение, что изменение текущего уровня ведения журнала отладки достигнет всех потоков через приемлемое количество времени (скажем, через несколько секунд)? В идеале я хотел бы, чтобы операция изменения уровня была синхронной, чтобы, когда пользователь получил подтверждение операции изменения уровня, он мог рассчитывать на последующий журнал, который будет отправлен в соответствии с новым уровнем.
Буду также признателен за любые предложения по альтернативным реализациям, которые удовлетворяют вышеуказанным требованиям (минимальное влияние на производительность для сравнения уровней и синхронное изменение уровня с задержкой не более нескольких секунд).