Как добавить определенный префикс к выходу журнала в Rust? - PullRequest
4 голосов
/ 25 сентября 2019

У меня есть объект, и я хочу, чтобы к каждому выходу журналирования добавлялись некоторые состояния объекта.Но добавлять префикс для каждого оператора регистрации очень неудобно.Есть ли простой способ реализовать это?

Ниже приведен пример кода.

use log::info;

struct Obj {
    id: i32,
    name: String,
}

impl Obj {
    // can I use `info!("receive {} from {}", item, from);` for simplicity?
    fn call_me(&self, item: i32, from: String) {
        info!("[id: {}][name: {}] receive {} from {}", self.id, self.name, item, from);
    }
    // ...many methods
}

Любая помощь будет оценена!

1 Ответ

5 голосов
/ 25 сентября 2019

Вы могли бы написать макрос для этого:

#[macro_export]
macro_rules! log {
    ($sel:ident, $s:literal, $($arg:tt)*)
    =>
    (info!(concat!("[id: {}] [name: {}] ", $s), $sel.id, $sel.name, $($arg)*));
}

struct Obj {
    id: i32,
    name: String,
}

impl Obj {
    fn call_me(&self, item: i32, from: String) {
        log!(self, "receive {} from {}", item, from);
    }
}

Это не идеально, так как вам все еще нужно передать self, но я не уверен, что вы можете сделать лучше.

детская площадка

...