ログメッセージ
コンソールにデバッグメッセージをログ出力する
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 の便利なマクロ 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 にログを出力する
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");
}
カスタムロガーでログメッセージを出力する
stdout に出力するカスタムロガー ConsoleLogger を実装します。
ロギングマクロを使用するために、ConsoleLogger は
log::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 にログを出力する
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.");
}