与Rocket搭配使用日志时,无法在此范围内找到宏`log`

问题描述

我在尝试使用工作区中的程序包中的日志箱时遇到编译器错误。工作区中的其他箱子都使用日志记录没有问题。

Cargo.toml:

[dependencies]
log = "^0"
rocket = "^0"

[dependencies.uuid]
version = "^0"
features = ["v4"]

lib.rs:

#![feature(proc_macro_hygiene,decl_macro)]

use rocket::{
    Request,Data,Response
};

use rocket::request::{
    self,Fromrequest,Outcome
};

use rocket::fairing::{
    Fairing,Info,Kind
};

use uuid::Uuid;

use std::fmt;

use log;



pub struct LoggerFairing {
    service_name: &'static str
}


impl LoggerFairing {
    pub fn new(service_name: &'static str) -> Self {
        LoggerFairing {
            service_name
        }
    }
}


impl Fairing for LoggerFairing {
    fn info(&self) -> Info {
        Info {
            name: self.service_name,kind: Kind::Request | Kind::Response
        }
    }


    fn on_request(&self,req: &mut Request,_: &Data) {
        let ip_addr = req.client_ip().map(|addr| addr.to_string())
            .unwrap_or("IP Address unkNown".to_string());

        let method = req.method();

        let url = req.uri();

        let request_id = get_request_id(req);

        log::info!("request {:?} from {}: {} {}",request_id,ip_addr,method,url);
    }


    fn on_response(&self,req: &Request,res: &mut Response) {
        let request_id = get_request_id(req);

        let status = res.status();

        log::info!("request {:?} responded with {}",status);
    }
}


fn get_request_id<'t,'r>(req: &'t Request<'r>) -> Option<RequestId<'t>> {
    match req.guard::<RequestId>() {
        Outcome::Success(request_id) => Some(request_id),_ => None
    }
}



pub struct RequestId<'t> {
    pub id: &'t Uuid
}    


impl<'t,'r> Fromrequest<'t,'r> for RequestId<'t> {
    type Error = ();
    
    fn from_request(req: &'t Request<'r>) -> request::Outcome<Self,Self::Error> {
        let id = req.local_cache(|| Uuid::new_v4());
        
        request::Outcome::Success(RequestId {
            id
        })
    }
}


impl<'t> fmt::display for RequestId<'t> {
    fn fmt(&self,f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f,"{}",self.id)
    }
}

错误消息:

error: cannot find macro `log` in this scope
  --> utils\logging\src\lib.rs:62:9
   |
62 |         log::info!("request {:?} from {}: {} {}",url);
   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   |
   = note: this error originates in a macro (in Nightly builds,run with -Z macro-backtrace for more info)

error: cannot find macro `log` in this scope
  --> utils\logging\src\lib.rs:71:9
   |
71 |         log::info!("request {:?} responded with {}",status);
   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   |
   = note: this error originates in a macro (in Nightly builds,run with -Z macro-backtrace for more info)

error: aborting due to 2 prevIoUs errors

error: Could not compile `logging`.

我使用了use log语句的几种变体以及如何调用info!宏,但是它们都导致相同的错误消息。我尝试在Cargo.toml中指定确切的版本。

我很困惑。这正是我使用其他板条箱登录的方式。

解决方法

在Cargo.toml中指定日志箱的确切版本(0.4.11)可解决此问题。

我假设当Cargo尝试解决依赖性时,会发生一些有趣的事情。