tauriでログを任意の場所に吐く(rust)

Rust

ログライブラリは公式のtauri-plugin-logを利用します。

GitHub - tauri-apps/tauri-plugin-log: [READ ONLY] This repository is a mirror, for issue tracking and development head to: https://github.com/tauri-apps/plugins-workspace
Thisrepositoryisamirror,forissuetrackinganddevelopmentheadto:-tauri-apps/tauri-plugin-log

まずはログを出力するまで

Rust側のログ出力

Rustに触るのがほぼ初めてなため知らなかったのですが、rustのlogというcrateは基本的にinterfaceのみの実装で、実際にログを出力するには好きなライブラリを合わせて使うようです。

# Cargo.toml

[dependencies]
log = "^0.4"
tauri-plugin-log = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v1" }

あとはrust側のコードで初期化時に呼び出せばOK。
(今回とは直接関係ないですが別の呼び出しの都合でasync関数になってます)

# main.rs

use tauri_plugin_log::{LogTarget};

#[async_std::main]
async fn main() {
    tauri::Builder::default()
        .plugin(tauri_plugin_log::Builder::default()
            .targets([
                LogTarget::LogDir,
                LogTarget::Stdout,
                LogTarget::Webview,
            ])
            .build())
        .invoke_handler(tauri::generate_handler![greet])
        .run(tauri::generate_context!())
        .expect("error while building tauri application");
}

ここまで出来れば後は任意のタイミングで
debug!(“hogehoge”);
などと呼び出してあげればOKです。

LogTargetで出力先を決めているため、WebView指定でブラウザ側で受け取ることもできます。
LogTarget::LogDirはwindowsの場合、

C\Users\{username}\AppData\Roaming\{identifier}\logs\{productname}.log

になります。
identifierはtauri.conf.jsonのtauri.bundle.identifierの値です。
productnameはtauri.conf.jsonのpackage.productNameの値です。

js側のログ出力

さて、無事にログが吐けることが確認できたと思います。
invoke_handler経由でrust側からログを吐くように作ってもいいのですが、そこを自前で実装するのは面倒なので、便利なnpmライブラリを利用しましょう。

プラグインのreadmeに書いてありますが、以下のライブラリをインストールします。

npm add https://github.com/tauri-apps/tauri-plugin-log#v1

これでjs側で簡単にログ出力ができます。

import {
  attachConsole,
  trace,
  debug,
  info,
  warn,
  error,
} from "tauri-plugin-log-api";

debug("hogehoge");

ドキュメントが詳しいので参考にしてください。

Debugging - The Tauri Documentation WIP

ログファイルの場所を変更する

さて、ここまでで最低限必要なことはできるようになりました。
ただし、今回はいわゆる既定のデータ領域以外にログを吐き出したいのでもう一工夫します。

#[cfg(windows)]
fn program_data_dir() -> PathBuf {
    use std::env;

    PathBuf::from(env::var("PROGRAMDATA").unwrap_or("/ProgramData".to_string()))
}

fn log_dir() -> PathBuf {
    program_data_dir().join("hogehoge".to_string())
}

#[async_std::main]
async fn main() {
    tauri::Builder::default()
        .plugin(tauri_plugin_log::Builder::default()
            .targets([
                LogTarget::Folder(log_dir().into()),
                LogTarget::Stdout
            ])
            .build())
        .invoke_handler(tauri::generate_handler![greet])
        .run(tauri::generate_context!())
        .expect("error while building tauri application");
}

今回はC\ProgramData\hogehogeディレクトリに出力することにしました。
段階を踏んでいて冗長なのですが、まずProgramDataディレクトリを取得し”hogehoge”をjoinしています。そして、LogTargetにはFolderというパラメータがあり、ここにPathBufを渡すことで対象ディレクトリにログを出力できます。

つまり上記のコードの場合、
C\ProgramData\hogehoge\{identifier}.log
というファイルが出力されます。

余談

ログとは直接関係ないですが、@tauri-apps/api/fsを使ってjs側のコードから直接ファイル読み書きするのも手段の1つとして知っておくといいです。利用するには設定変更が必要ですが詳しくはググってください。

import {
  readTextFile,
  writeTextFile,
  BaseDirectory,
} from "@tauri-apps/api/fs";

この中にBaseDirectoryという特定のディレクトリを指すEnumが内包されているため、例えばデスクトップのパスを指定したい場合などは

BaseDirectory.Desktop

などと指定することができます。

この方の記事が詳しいので気になったら参考にしてください。

【TS×Rust】Tauriの便利機能紹介またはTauriを百合作品だと考察するポエム的な何か - Qiita
前回作ったaudio-bookmarkにつづき、Rust+ReactwithTauriでまたまた自己満足アプリを作りました!本記事では、作品紹介のついでに、Tauriならではな機能も紹介し…
Rust
スポンサーリンク
Once and Only

コメント