Skip to content

Commit b6d8332

Browse files
committed
read RUST_LOG
1 parent 34bc480 commit b6d8332

File tree

5 files changed

+87
-5
lines changed

5 files changed

+87
-5
lines changed

android-app/app/src/main/java/com/nervosnetwork/ckblightclient/LightClientNative.kt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,19 @@ object LightClientNative {
5656
*/
5757
external fun nativeGetStatus(): Int
5858

59+
/**
60+
* Set log filter using RUST_LOG format
61+
*
62+
* @param filter RUST_LOG-style filter string
63+
* Examples:
64+
* - "info" - all modules at info level
65+
* - "debug" - all modules at debug level
66+
* - "info,ckb_network=debug" - most at info, ckb_network at debug
67+
* - "info,ckb_network=debug,ckb_sync=trace" - per-module levels
68+
* @return true if successful, false otherwise
69+
*/
70+
external fun nativeSetLogFilter(filter: String): Boolean
71+
5972
// ========================================
6073
// Query APIs (17 functions)
6174
// ========================================

android-app/app/src/main/java/com/nervosnetwork/ckblightclient/LightClientService.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,12 @@ class LightClientService : Service() {
183183

184184
appendLog("Native initialization succeeded")
185185

186+
// Apply saved RUST_LOG filter
187+
val prefs = getSharedPreferences("CKBLightClientPrefs", Context.MODE_PRIVATE)
188+
val savedFilter = prefs.getString("rust_log_filter", "info") ?: "info"
189+
LightClientNative.nativeSetLogFilter(savedFilter)
190+
appendLog("Applied log filter: $savedFilter")
191+
186192
// Start the light client
187193
val startSuccess = LightClientNative.nativeStart()
188194

light-client-lib/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ ckb-stop-handler = "1"
6363
[target.'cfg(target_os = "android")'.dependencies]
6464
jni = "0.21"
6565
android_logger = "0.13"
66+
env_logger = "0.11"
6667

6768
[target.'cfg(target_arch = "wasm32")'.dependencies]
6869
web-time = "1.1.0"

light-client-lib/src/jni_bridge/callbacks.rs

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,10 @@ use super::types::{JAVA_VM, LOG_CALLBACK, STATUS_CALLBACK};
66
use jni::JNIEnv;
77
use jni::objects::{JObject, JString, JValue};
88
use jni::sys::jobjectArray;
9-
use log::{Level, Log, Metadata, Record};
10-
use std::sync::{Arc, Mutex};
9+
use log::{Level, LevelFilter, Log, Metadata, Record};
10+
use std::sync::{Arc, Mutex, RwLock};
1111
use std::time::{Duration, Instant};
12+
use env_logger::filter::{Builder as FilterBuilder, Filter};
1213

1314
/// Log buffer for batching
1415
struct LogBuffer {
@@ -31,13 +32,40 @@ impl LogBuffer {
3132

3233
static LOG_BUFFER: Mutex<Option<LogBuffer>> = Mutex::new(None);
3334

34-
/// JNI Logger implementation with batching
35+
/// Global log filter using env_logger's Filter for RUST_LOG-style filtering
36+
static LOG_FILTER: RwLock<Option<Filter>> = RwLock::new(None);
37+
38+
/// Update log filter from RUST_LOG-style string using env_logger's parser
39+
/// Examples: "info", "debug", "info,ckb_network=debug", "info,ckb_sync=trace,ckb_network=debug"
40+
pub fn set_log_filter(rust_log: &str) {
41+
// Set RUST_LOG environment variable so env_logger can parse it
42+
std::env::set_var("RUST_LOG", rust_log);
43+
44+
// Let env_logger parse the RUST_LOG environment variable
45+
let filter = FilterBuilder::from_default_env().build();
46+
47+
// Update global filter
48+
if let Ok(mut filter_guard) = LOG_FILTER.write() {
49+
*filter_guard = Some(filter);
50+
log::set_max_level(LevelFilter::Trace); // Allow all, filtering in enabled()
51+
}
52+
}
53+
54+
/// JNI Logger implementation with batching and RUST_LOG-style filtering
3555
pub struct JniLogger;
3656

3757
impl Log for JniLogger {
3858
fn enabled(&self, metadata: &Metadata) -> bool {
39-
// Enable all levels, filtering is done by env_logger
40-
metadata.level() <= Level::Trace
59+
if let Ok(filter_guard) = LOG_FILTER.read() {
60+
if let Some(filter) = filter_guard.as_ref() {
61+
filter.matches(metadata)
62+
} else {
63+
// Default to info level if no filter set
64+
metadata.level() <= LevelFilter::Info
65+
}
66+
} else {
67+
metadata.level() <= LevelFilter::Info
68+
}
4169
}
4270

4371
fn log(&self, record: &Record) {

light-client-lib/src/jni_bridge/lifecycle.rs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,8 @@ pub extern "C" fn Java_com_nervosnetwork_ckblightclient_LightClientNative_native
101101
eprintln!("Failed to set logger: {}", e);
102102
return JNI_FALSE;
103103
}
104+
// Default to Info level - can be changed via nativeSetLogLevel()
105+
// or by setting RUST_LOG-style filter string
104106
log::set_max_level(log::LevelFilter::Info);
105107

106108
info!("Starting CKB Light Client JNI initialization...");
@@ -392,3 +394,35 @@ pub extern "C" fn Java_com_nervosnetwork_ckblightclient_LightClientNative_native
392394
) -> jint {
393395
get_state() as jint
394396
}
397+
398+
/// JNI: Set log filter using RUST_LOG format
399+
///
400+
/// Parameters:
401+
/// - filter_str: RUST_LOG-style filter string
402+
/// Examples:
403+
/// - "info" - all modules at info level
404+
/// - "debug" - all modules at debug level
405+
/// - "info,ckb_network=debug" - most at info, ckb_network at debug
406+
/// - "info,ckb_network=debug,ckb_sync=trace" - per-module levels
407+
///
408+
/// Returns true if successful, false otherwise
409+
#[no_mangle]
410+
pub extern "C" fn Java_com_nervosnetwork_ckblightclient_LightClientNative_nativeSetLogFilter(
411+
mut env: JNIEnv,
412+
_class: JClass,
413+
filter_jstr: JString,
414+
) -> jboolean {
415+
// Get filter string
416+
let filter_str: String = match env.get_string(&filter_jstr) {
417+
Ok(s) => s.into(),
418+
Err(e) => {
419+
error!("Failed to get filter string: {}", e);
420+
return JNI_FALSE;
421+
}
422+
};
423+
424+
info!("Setting log filter to: {}", filter_str);
425+
super::callbacks::set_log_filter(&filter_str);
426+
427+
JNI_TRUE
428+
}

0 commit comments

Comments
 (0)