ロギングを設定する
モジュールごとにログレベルを有効にする
foo と、そのネストされた foo::bar という 2 つのモジュールを作成し、RUST_LOG 環境変数によってログ出力のディレクティブを個別に制御します。
mod foo {
mod bar {
pub fn run() {
log::warn!("[bar] warn");
log::info!("[bar] info");
log::debug!("[bar] debug");
}
}
pub fn run() {
log::warn!("[foo] warn");
log::info!("[foo] info");
log::debug!("[foo] debug");
bar::run();
}
}
fn main() {
env_logger::init();
log::warn!("[root] warn");
log::info!("[root] info");
log::debug!("[root] debug");
foo::run();
}
RUST_LOG 環境変数は env_logger の出力を制御します。
モジュール宣言には、path::to::module=log_level 形式のカンマ区切りエントリを指定します。test アプリケーションは次のように実行します。
RUST_LOG="warn,test::foo=info,test::foo::bar=debug" ./test
これにより、デフォルトの log::Level は warn に、モジュール foo は info に、モジュール foo::bar は debug に設定されます。
WARN:test: [root] warn
WARN:test::foo: [foo] warn
INFO:test::foo: [foo] info
WARN:test::foo::bar: [bar] warn
INFO:test::foo::bar: [bar] info
DEBUG:test::foo::bar: [bar] debug
カスタム環境変数を使用してロギングを設定する
Builder はロギングを設定します。
Builder::from_env は MY_APP_LOG
環境変数の内容を RUST_LOG 構文の形式で解析します。
その後、Builder::init がロガーを初期化します。
use env_logger::Builder;
fn main() {
Builder::from_env("MY_APP_LOG").init();
log::info!("informational message");
log::warn!("warning message");
log::error!("this is an error {}", "message");
}
ログメッセージにタイムスタンプを含める
Builder を使ってカスタムロガー設定を作成します。
各ログエントリでは Local::now を呼び出してローカル
タイムゾーンの現在の DateTime を取得し、
DateTime::format と strftime::specifiers を使って、
最終的なログで使用するタイムスタンプを整形します。
この例では Builder::format を呼び出して、各メッセージテキストを
タイムスタンプ、Record::level、および本文(Record::args)で
整形するクロージャを設定しています。
use std::io::Write;
use chrono::Local;
use env_logger::Builder;
use log::LevelFilter;
fn main() {
Builder::new()
.format(|buf, record| {
writeln!(buf,
"{} [{}] - {}",
Local::now().format("%Y-%m-%dT%H:%M:%S"),
record.level(),
record.args()
)
})
.filter(None, LevelFilter::Info)
.init();
log::warn!("warn");
log::info!("info");
log::debug!("debug");
}
stderr の出力には次の内容が含まれます
2017-05-22T21:57:06 [WARN] - warn
2017-05-22T21:57:06 [INFO] - info
カスタムの場所にログメッセージを出力する
log4rs はログ出力をカスタムの場所に設定します。log4rs は、外部 YAML ファイルまたはビルダー構成のいずれかを使用できます。
log4rs::append::file::FileAppender でログ設定を作成します。appender はログの出力先を定義します。設定は、log4rs::encode::pattern のカスタムパターンを使用したエンコードへと続きます。
その設定を log4rs::config::Config に割り当て、デフォルトの
log::LevelFilter を設定します。
use anyhow::Result;
use log::LevelFilter;
use log4rs::append::file::FileAppender;
use log4rs::encode::pattern::PatternEncoder;
use log4rs::config::{Appender, Config, Root};
fn main() -> Result<()> {
let logfile = FileAppender::builder()
.encoder(Box::new(PatternEncoder::new("{l} - {m}\n")))
.build("log/output.log")?;
let config = Config::builder()
.appender(Appender::builder().build("logfile", Box::new(logfile)))
.build(Root::builder()
.appender("logfile")
.build(LevelFilter::Info))?;
log4rs::init_config(config)?;
log::info!("Hello, world!");
Ok(())
}