Skip to content

Commit

Permalink
JavaのinitLoggerのnative実装を移動
Browse files Browse the repository at this point in the history
  • Loading branch information
qryxip committed Feb 23, 2024
1 parent f9d956d commit fa75521
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 64 deletions.
65 changes: 1 addition & 64 deletions crates/voicevox_core_java_api/src/common.rs
Original file line number Diff line number Diff line change
@@ -1,70 +1,7 @@
use std::{error::Error as _, iter};

use derive_more::From;
use jni::{
objects::{JObject, JThrowable},
JNIEnv,
};

// FIXME: 別ファイルに分離する
#[no_mangle]
extern "system" fn Java_jp_hiroshiba_voicevoxcore_Dll_00024LoggerInitializer_initLogger(
_: JNIEnv<'_>,
_: JObject<'_>,
) {
if cfg!(target_os = "android") {
android_logger::init_once(
android_logger::Config::default()
.with_tag("VoicevoxCore")
.with_filter(
android_logger::FilterBuilder::new()
.parse("error,voicevox_core=info,voicevox_core_java_api=info,onnxruntime=error")
.build(),
),
);
} else {
// TODO: Android以外でのログ出力を良い感じにする。(System.Loggerを使う?)
use chrono::SecondsFormat;
use std::{
env, fmt,
io::{self, IsTerminal, Write},
};
use tracing_subscriber::{fmt::format::Writer, EnvFilter};

// FIXME: `try_init` → `init` (subscriberは他に存在しないはずなので)
let _ = tracing_subscriber::fmt()
.with_env_filter(if env::var_os(EnvFilter::DEFAULT_ENV).is_some() {
EnvFilter::from_default_env()
} else {
"error,voicevox_core=info,voicevox_core_c_api=info,onnxruntime=error".into()
})
.with_timer(local_time as fn(&mut Writer<'_>) -> _)
.with_ansi(out().is_terminal() && env_allows_ansi())
.with_writer(out)
.try_init();

fn local_time(wtr: &mut Writer<'_>) -> fmt::Result {
// ローカル時刻で表示はするが、そのフォーマットはtracing-subscriber本来のものに近いようにする。
// https://github.com/tokio-rs/tracing/blob/tracing-subscriber-0.3.16/tracing-subscriber/src/fmt/time/datetime.rs#L235-L241
wtr.write_str(&chrono::Local::now().to_rfc3339_opts(SecondsFormat::Micros, false))
}

fn out() -> impl IsTerminal + Write {
io::stderr()
}

fn env_allows_ansi() -> bool {
// https://docs.rs/termcolor/1.2.0/src/termcolor/lib.rs.html#245-291
// ただしWindowsではPowerShellっぽかったらそのまま許可する。
// ちゃんとやるなら`ENABLE_VIRTUAL_TERMINAL_PROCESSING`をチェックするなり、そもそも
// fwdansiとかでWin32の色に変換するべきだが、面倒。
env::var_os("TERM").map_or(
cfg!(windows) && env::var_os("PSModulePath").is_some(),
|term| term != "dumb",
) && env::var_os("NO_COLOR").is_none()
}
}
}
use jni::{objects::JThrowable, JNIEnv};

#[macro_export]
macro_rules! object {
Expand Down
1 change: 1 addition & 0 deletions crates/voicevox_core_java_api/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
mod common;
mod info;
mod logger;
mod open_jtalk;
mod synthesizer;
mod user_dict;
Expand Down
60 changes: 60 additions & 0 deletions crates/voicevox_core_java_api/src/logger.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
use jni::{objects::JObject, JNIEnv};

#[no_mangle]
extern "system" fn Java_jp_hiroshiba_voicevoxcore_Dll_00024LoggerInitializer_initLogger(
_: JNIEnv<'_>,
_: JObject<'_>,
) {
if cfg!(target_os = "android") {
android_logger::init_once(
android_logger::Config::default()
.with_tag("VoicevoxCore")
.with_filter(
android_logger::FilterBuilder::new()
.parse("error,voicevox_core=info,voicevox_core_java_api=info,onnxruntime=error")
.build(),
),
);
} else {
// TODO: Android以外でのログ出力を良い感じにする。(System.Loggerを使う?)
use chrono::SecondsFormat;
use std::{
env, fmt,
io::{self, IsTerminal, Write},
};
use tracing_subscriber::{fmt::format::Writer, EnvFilter};

// FIXME: `try_init` → `init` (subscriberは他に存在しないはずなので)
let _ = tracing_subscriber::fmt()
.with_env_filter(if env::var_os(EnvFilter::DEFAULT_ENV).is_some() {
EnvFilter::from_default_env()
} else {
"error,voicevox_core=info,voicevox_core_c_api=info,onnxruntime=error".into()
})
.with_timer(local_time as fn(&mut Writer<'_>) -> _)
.with_ansi(out().is_terminal() && env_allows_ansi())
.with_writer(out)
.try_init();

fn local_time(wtr: &mut Writer<'_>) -> fmt::Result {
// ローカル時刻で表示はするが、そのフォーマットはtracing-subscriber本来のものに近いようにする。
// https://github.com/tokio-rs/tracing/blob/tracing-subscriber-0.3.16/tracing-subscriber/src/fmt/time/datetime.rs#L235-L241
wtr.write_str(&chrono::Local::now().to_rfc3339_opts(SecondsFormat::Micros, false))
}

fn out() -> impl IsTerminal + Write {
io::stderr()
}

fn env_allows_ansi() -> bool {
// https://docs.rs/termcolor/1.2.0/src/termcolor/lib.rs.html#245-291
// ただしWindowsではPowerShellっぽかったらそのまま許可する。
// ちゃんとやるなら`ENABLE_VIRTUAL_TERMINAL_PROCESSING`をチェックするなり、そもそも
// fwdansiとかでWin32の色に変換するべきだが、面倒。
env::var_os("TERM").map_or(
cfg!(windows) && env::var_os("PSModulePath").is_some(),
|term| term != "dumb",
) && env::var_os("NO_COLOR").is_none()
}
}
}

0 comments on commit fa75521

Please sign in to comment.