2014-10-01 102 views
1

我正在Rust中開發一個項目,該項目旨在供系統管理員通過CLI使用。 在這個程序中,我想有這樣的詩句:有沒有辦法以編程方式更改日誌箱的默認日誌記錄級別?

warn!("File {} not found, proceeding to next file", file_path); 

,我不認爲在軟件方面的錯誤,但我仍然希望我的用戶做到心中有數。

然而,鏽病的記錄系統,在默認情況下,只打印在ERROR日誌級別的消息,我發現要改變這種默認的唯一方法是設置RUST_LOG環境變量 - 我不希望我的用戶有去做。我想我可以創建一個包裝腳本,只是設置變量和exec s程序,但我寧願不要。

有沒有辦法從程序內部以編程方式更改默認級別?

回答

3

不,這是不可能的。只需瀏覽liblog庫的代碼,就可以看到所有日誌級別配置都存儲在僅修改一次的全局變量中,使用Once原語,並且無法修改此配置。

鏽跡測井非常簡單;如果你想要更復雜的東西,你必須自己做。 liblog提供了一個擴展點,稱爲Logger的特徵,它可能可以用於您的目的。

+0

謝謝!這是正確的答案,但我最終找到了一個很好的方法來做到這一點(參見我的答案)。我仍然認爲Rust應該允許這樣做:)(也許通過'--cfg'?) – 2014-10-01 14:36:22

0

感謝Vladimir's answer,我挖的liblog源,並最終找到一個哈克(也可能是活潑的)的方式來做到這一點:

fn main() { 
    use std::os; 
    os::setenv("RUST_LOG", "warn"); 
} 

如果這是任何記錄之前完成,那麼日誌記錄系統將被設置爲好像它是從外面設置的。

2

這裏是什麼,我認爲你正在尋找一個example

#[macro_use] 
extern crate log; 
use log::{LogRecord, LogLevel, LogMetadata, LogLevelFilter, SetLoggerError}; 

struct SimpleLogger; 

impl log::Log for SimpleLogger { 
    fn enabled(&self, metadata: &LogMetadata) -> bool { 
     metadata.level() <= LogLevel::Warn 
    } 

    fn log(&self, record: &LogRecord) { 
     if self.enabled(record.metadata()) { 
      // I can probably change colors here 
      println!("{} - {}", record.level(), record.args()); 
     } 
    } 
} 

pub fn init() -> Result<(), SetLoggerError> { 
    log::set_logger(|max_log_level| { 
     max_log_level.set(LogLevelFilter::Warn); 
     Box::new(SimpleLogger) 
    }) 
} 

fn main() { 

    init(); // probably should do something better here 

    info!("I am info"); 
    warn!("I am warn"); 
    error!("I am error"); 
} 
相關問題