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

log クレートはロギングユーティリティを提供します。env_logger クレートは 環境変数を介してロギングを設定します。log::debug! マクロは、他の std::fmt のフォーマット文字列と同様に動作します。

fn execute_query(query: &str) {
    log::debug!("Executing query: {}", query);
}

fn main() {
    env_logger::init();

    execute_query("DROP TABLE students");
}

このコードを実行しても、何も出力されません。デフォルトでは、 ログレベルは error であり、それより低いレベルは破棄されます。

メッセージを出力するには、RUST_LOG 環境変数を設定します:

$ RUST_LOG=debug cargo run

すると Cargo はデバッグ情報を出力し、その後、 出力の最後に次の行が表示されます:

DEBUG:main: Executing query: DROP TABLE students

コンソールにエラーメッセージをログ出力する

log-badge env_logger-badge cat-debugging-badge

適切なエラーハンドリングでは、例外的なものだけを例外として扱います。ここでは、エラーを log の便利なマクロ log::error! で標準エラー出力にログ出力します。

fn execute_query(_query: &str) -> Result<(), &'static str> {
    Err("I'm afraid I can't do that")
}

fn main() {
    env_logger::init();

    let response = execute_query("DROP TABLE students");
    if let Err(err) = response {
        log::error!("Failed to execute query: {}", err);
    }
}

stderr ではなく stdout にログを出力する

log-badge env_logger-badge cat-debugging-badge

Builder::target を使用してログ出力先を Target::Stdout に設定する、カスタムロガー構成を作成します。

use env_logger::{Builder, Target};

fn main() {
    Builder::new()
        .target(Target::Stdout)
        .init();

    log::error!("This error has been printed to Stdout");
}

カスタムロガーでログメッセージを出力する

log-badge cat-debugging-badge

stdout に出力するカスタムロガー ConsoleLogger を実装します。 ロギングマクロを使用するために、ConsoleLoggerlog::Log トレイトを実装し、log::set_logger でそれを登録します。

use log::{Record, Level, Metadata, LevelFilter, SetLoggerError};

static CONSOLE_LOGGER: ConsoleLogger = ConsoleLogger;

struct ConsoleLogger;

impl log::Log for ConsoleLogger {
  fn enabled(&self, metadata: &Metadata) -> bool {
     metadata.level() <= Level::Info
    }

    fn log(&self, record: &Record) {
        if self.enabled(record.metadata()) {
            println!("Rust says: {} - {}", record.level(), record.args());
        }
    }

    fn flush(&self) {}
}

fn main() -> Result<(), SetLoggerError> {
    log::set_logger(&CONSOLE_LOGGER)?;
    log::set_max_level(LevelFilter::Info);

    log::info!("hello log");
    log::warn!("warning");
    log::error!("oops");
    Ok(())
}

Unix syslog にログを出力する

log-badge syslog-badge cat-debugging-badge

UNIX syslog にメッセージを記録します。syslog::init を使用してロガーバックエンドを初期化 します。syslog::Facility はログエントリを送信するプログラムの分類を記録し、 log::LevelFilter は許可されるログの詳細度を示し、 Option<&str> は省略可能なアプリケーション名を保持します。

#[cfg(target_os = "linux")]
#[cfg(target_os = "linux")]
use syslog::{Facility, Error};

#[cfg(target_os = "linux")]
fn main() -> Result<(), Error> {
    syslog::init(Facility::LOG_USER,
                 log::LevelFilter::Debug,
                 Some("My app name"))?;
    log::debug!("this is a debug {}", "message");
    log::error!("this is an error!");
    Ok(())
}

#[cfg(not(target_os = "linux"))]
fn main() {
    println!("So far, only Linux systems are supported.");
}