Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

ロギングを設定する

モジュールごとにログレベルを有効にする

log-badge env_logger-badge cat-debugging-badge

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::Levelwarn に、モジュール fooinfo に、モジュール foo::bardebug に設定されます。

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

カスタム環境変数を使用してロギングを設定する

log-badge env_logger-badge cat-debugging-badge

Builder はロギングを設定します。

Builder::from_envMY_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");
}

ログメッセージにタイムスタンプを含める

log-badge env_logger-badge chrono-badge cat-debugging-badge

Builder を使ってカスタムロガー設定を作成します。 各ログエントリでは Local::now を呼び出してローカル タイムゾーンの現在の DateTime を取得し、 DateTime::formatstrftime::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

カスタムの場所にログメッセージを出力する

log-badge log4rs-badge cat-debugging-badge

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(())
}