Tauri(Rust+React+TypeScript) から始めるディスクトップアプリ #3[Rust Loggerの実装]

2023/08/22に公開

はじめに

ディスクトップアプリでは、Loggingが非常に重要になります。実行形式を利用者のクライアントにインストールするため、不具合が発生の原因把握のため詳細に取得しておく必要があります。また、Debugにも容易になるため、開発当初から導入するのが良いと考えています。

技術選定

独自実装することは当然ながらしません。先人の知恵をお借りします。
React側はWebアプリなので、クライアントのローカル環境にアクセスできませんので、Rustクレート(cpp cs のライブラリと同意)を利用します。
調べて見ると'log'が、ほぼ標準のようです。
https://crates.io/crates/log
ただし、'log' はインターフェースの実装のみに留まっていつため、出力するためには、個別に処理を書かなければならないようですが、この点も安心してください。たくさんのクレートがあります。
標準出力のみのシンプルなものから、OSにlog書き出しするものまでたくさんあります。
要件に合うものを探しましょう。

自分は、crates.ioのダウンロード数から順番に検討した結果'fern'にしました。 
https://docs.rs/fern/0.6.2/fern/
※2023/8/22 時点でカラーあたりにセキュリティ障害があるようです。注意して利用しましょう。

実装して見よう

クルートの導入は下記のようにします。

Cargo.toml
[dependencies]
+ log = "0.4"
+ fern = "0.6"

初期化を別モジュールにしました。

setup_logger.rs
use chrono; //DateTime 

pub fn init( logfile_name:&str ){
    let base_config = fern::Dispatch::new();
    //Fileoutput
    let file_config = fern::Dispatch::new()
        .level(log::LevelFilter::Info)
        .format(|out, message, record| {
            out.finish(format_args!(
                "[{}][{}]: {}",
                chrono::Local::now().format("%Y-%m-%d %H:%M:%S"),
                record.level(),
                message
            ))
        })
        .chain(fern::log_file(logfile_name).unwrap());
   //コンソール出力
    let stdout_config = fern::Dispatch::new()
        .level(log::LevelFilter::Trace)
        .format(|out, message, record| {
            out.finish(format_args!(
                "[{}][{}] {}",
                chrono::Local::now().format("%H:%M:%S"),
                record.level(),
                message
            ))
        })
        .chain(std::io::stdout());
   
    base_config
        .chain(file_config)
        .chain(stdout_config)
        .apply().unwrap();
}

下記のように利用できます。

main.rs
use log::{debug, error, info, trace, warn};
mod setup_logger;
fn main() {
  //logfile_name = "logfile.log";
  setup_logger::init("logging.log");
  info!("info logging Start");
  warn!("Warning logging Start");
  error!("error logging Start");
  trace!("trace logging Start");
  debug!("Debig logging Start");
}

おわりに

おつかれさまでした。
クレートを使えば非常に簡単に実装できました。
rustのコーディングについても随分となれて来ました。
rust難しい印象が強いですが、慣れると気持ちいいかも(草

Discussion