Как программно получить уровень журналирования в Rust?

У меня есть приложение 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?

Вы можете просто использовать debug журнал, если он не установлен, он не будет распечатан на выходе (учитывая, что вы используете флажок только для входа)

Timsib Adnap 26.06.2024 10:42

@TimsibAdnap Спасибо за ваш ответ. Нет, я также выполню некоторые другие операции для расчета значения для журнала, поэтому мне интересно сначала проверить уровень журнала.

Deepanshu Bhardwaj 26.06.2024 11:26

«Уровень ведения журнала» не является универсальной концепцией в Rust, поэтому вам нужно будет добавить необходимые детали, чтобы мы могли ответить на вопрос. В частности, какой ящик вы используете для входа? Пожалуйста, отредактируйте свой вопрос, добавив недостающую информацию.

cafce25 26.06.2024 13:55
Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
0
3
99
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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 использует ящик журналов, но вы можете настроить его с помощью собственного промежуточного программного обеспечения трассировки или просто настроить трассировку для приема журналов из макросов ящика журналов или наоборот (документация).

Другие вопросы по теме