У меня есть приложение Rust, использующее Actix-web. Как я могу получить определенный уровень журналирования? Я хочу выполнить метод для регистрации чего-либо, если уровень ведения журнала «Отладка», в противном случае — нет.
#[tokio::main]
async fn main() {
SimpleLogger::new().env().with_level(LevelFilter::Error).init().unwrap();
if is_degug_log_enabled() {
any_logging_method();
}
}
fn is_degug_log_enabled() -> bool {
// in this case it should return false as logging level is 'Error'
}
Каким должно быть тело метода is_degug_log_enabled
?
@TimsibAdnap Спасибо за ваш ответ. Нет, я также выполню некоторые другие операции для расчета значения для журнала, поэтому мне интересно сначала проверить уровень журнала.
«Уровень ведения журнала» не является универсальной концепцией в Rust, поэтому вам нужно будет добавить необходимые детали, чтобы мы могли ответить на вопрос. В частности, какой ящик вы используете для входа? Пожалуйста, отредактируйте свой вопрос, добавив недостающую информацию.
SimpleLogger
— это одна из многих реализаций ящика log . После инициализации с ним можно взаимодействовать только через признак Log , который можно получить с помощью log::logger().
Однако это не раскрывает «текущий уровень», поскольку это слишком узкий показатель для того, что пользователи часто хотят регистрировать. Контекст также важен. В частности, реализация Log
решает, что регистрировать, на основе Метаданных, которые включают уровень и цель. Целью является путь к модулю (т. е. some_crate::nested::module
). Поэтому, чтобы проверить, будет ли что-то записано в журнал, вам нужно получить или воссоздать для этого Metadata
и вызвать .enabled()
. К счастью, это решается за вас.
Используйте log_enabled!():
Это можно использовать, чтобы избежать дорогостоящего вычисления аргументов сообщения журнала, если сообщение все равно будет проигнорировано.
if log::log_enabled!(Debug) {
any_logging_method();
}
Это второстепенный вопрос, но стоит отметить другой де-факто ящик для журналирования, трассировка , работает примерно так же: у него есть Подписчик в качестве интерфейса, который имеет enabled()
метод, который принимает некоторые Метаданные . Метаданные и взаимодействие с подписчиком усложняются из-за расширенной настройки, структурированного ведения журнала и промежутков; но концепция та же: подписчики/пользователи могут захотеть фильтровать журналы не только по уровню.
К счастью, вам не нужно об этом беспокоиться и вы можете просто использовать одну из включенных функций ! макросы. Ниже я использовал event_enabled!
, поскольку сообщения журнала — это «события» на языке трассировки:
if tracing::event_enabled!(Level::DEBUG) {
any_logging_method();
}
Вы можете прочитать документацию для получения дополнительной информации о интервалах или структурированном журналировании.
Насколько мне известно, Actix-Web использует ящик журналов, но вы можете настроить его с помощью собственного промежуточного программного обеспечения трассировки или просто настроить трассировку для приема журналов из макросов ящика журналов или наоборот (документация).
Вы можете просто использовать
debug
журнал, если он не установлен, он не будет распечатан на выходе (учитывая, что вы используете флажок только для входа)