Skip to content

Commit c36c990

Browse files
committed
feat: added the ultimate logging setup
- ability to control logging level on-boot - handle logging level in stdout, webview, and to file - implement 6 levels of logs
1 parent 7338e3a commit c36c990

File tree

5 files changed

+79
-17
lines changed

5 files changed

+79
-17
lines changed

GUI/ETVR/src-tauri/src/main.rs

+19-11
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ fn main() {
7777
tauri_commands::do_rest_request,
7878
tauri_commands::unzip_archive,
7979
tauri_commands::handle_save_window_state,
80-
tauri_commands::handle_load_window_state
80+
tauri_commands::handle_load_window_state,
8181
])
8282
// allow only one instance and propagate args and cwd to existing instance
8383
.plugin(tauri_plugin_single_instance::init(|app, args, cwd| {
@@ -93,21 +93,29 @@ fn main() {
9393
// save window position and size between sessions
9494
.plugin(tauri_plugin_window_state::Builder::default().build())
9595
// log to file, stdout and webview console support
96-
.plugin(
97-
tauri_plugin_log::Builder::default()
98-
.targets([
99-
tauri_plugin_log::LogTarget::LogDir,
100-
tauri_plugin_log::LogTarget::Stdout,
101-
tauri_plugin_log::LogTarget::Webview,
102-
])
103-
.build(),
104-
)
105-
.setup(|app| {
96+
.setup(move |app| {
10697
let window = app
10798
.get_window("main")
10899
.unwrap_or_else(|| panic!("Failed to get window {}", "main"));
109100
//set_shadow(&window, true).expect("Unsupported platform!");
110101
window.hide().unwrap();
102+
103+
let app_handle = app.handle();
104+
105+
app_handle
106+
.plugin(
107+
tauri_plugin_log::Builder::default()
108+
.targets([
109+
tauri_plugin_log::LogTarget::LogDir,
110+
tauri_plugin_log::LogTarget::Stdout,
111+
tauri_plugin_log::LogTarget::Webview,
112+
])
113+
.filter(|metadata| metadata.target() != "polling::iocp")
114+
.level(tauri_commands::handle_debug(app_handle.clone()).unwrap())
115+
.build(),
116+
)
117+
.expect("Failed to initialize logger");
118+
111119
Ok(())
112120
})
113121
.system_tray(tray)

GUI/ETVR/src-tauri/src/modules/m_dnsquery/mod.rs

+6-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
//! A mdns query client.
22
3-
use log::{error};
3+
use log::error;
44
use mdns_sd::{ServiceDaemon, ServiceEvent};
5-
use serde::{Serialize};
5+
use serde::Serialize;
66
use std::collections::hash_map::HashMap;
77
use std::sync::{Arc, Mutex};
88

@@ -87,7 +87,7 @@ pub async fn run_query(
8787
let now = std::time::Instant::now();
8888
//* listen for event then stop the event loop after 5 seconds.
8989
// while let Ok(event) = receiver.recv() {}
90-
while now.elapsed().as_secs() < scan_time {
90+
while now.elapsed().as_secs() <= scan_time {
9191
//* let event = receiver.recv().expect("Failed to receive event");
9292
if let Ok(event) = receiver.recv_async().await {
9393
match event {
@@ -137,6 +137,9 @@ pub async fn run_query(
137137
}
138138
}
139139
}
140+
std::thread::sleep(std::time::Duration::from_nanos(1));
141+
mdns.stop_browse(&service_type).map_err(|e| e.to_string())?;
142+
mdns.shutdown().map_err(|e| e.to_string())?;
140143
Ok(())
141144
}
142145

GUI/ETVR/src-tauri/src/modules/tauri_commands/mod.rs

+50-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1+
use log::debug;
2+
use log::{error, info, warn};
13
use tauri::{self, Manager};
4+
5+
use tauri_plugin_store::with_store;
6+
27
use tauri_plugin_window_state::{AppHandleExt, StateFlags, WindowExt};
38
use whoami::username;
49

5-
use log::info;
6-
710
use crate::modules::m_dnsquery;
811
use crate::modules::rest_client;
912

@@ -120,3 +123,48 @@ pub async fn handle_load_window_state<R: tauri::Runtime>(
120123

121124
Ok(())
122125
}
126+
127+
pub fn handle_debug<R: tauri::Runtime>(
128+
app: tauri::AppHandle<R>,
129+
) -> Result<log::LevelFilter, String> {
130+
// read the Store file
131+
let stores = app.state::<tauri_plugin_store::StoreCollection<R>>();
132+
let path = std::path::PathBuf::from(".app-settings.etvr");
133+
// match the store value to a LogFilter
134+
let mut debug_state: String = String::new();
135+
with_store(app.clone(), stores, path, |store| {
136+
let settings = store.get("settings");
137+
debug!("Settings: {:?}", settings);
138+
if let Some(json) = settings {
139+
let _serde_json = serde_json::from_value::<serde_json::Value>(json.clone());
140+
debug!("Serde JSON: {:?}", _serde_json);
141+
let serde_json_result = match _serde_json {
142+
Ok(serde_json) => serde_json,
143+
Err(err) => {
144+
error!("Error configuring JSON config file: {}", err);
145+
return Err(tauri_plugin_store::Error::Json(err));
146+
}
147+
};
148+
let temp = &serde_json_result["debugMode"];
149+
debug!("Debug: {:?}", temp);
150+
debug_state = serde_json::from_value::<String>(temp.clone()).unwrap();
151+
} else {
152+
debug_state = serde_json::json!({}).to_string();
153+
}
154+
info!("Debug state: {}", debug_state);
155+
Ok(())
156+
})
157+
.expect("Failed to get store");
158+
// set the log level
159+
let log_level = match debug_state.as_str() {
160+
"off" => log::LevelFilter::Off,
161+
"error" => log::LevelFilter::Error,
162+
"warn" => log::LevelFilter::Warn,
163+
"info" => log::LevelFilter::Info,
164+
"debug" => log::LevelFilter::Debug,
165+
"trace" => log::LevelFilter::Trace,
166+
_ => log::LevelFilter::Info,
167+
};
168+
// return the result
169+
Ok(log_level)
170+
}

GUI/ETVR/src/routes/Routes.tsx

+3-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { useRoutes } from '@solidjs/router'
22
import { createEffect, onMount } from 'solid-js'
33
import { useEventListener } from 'solidjs-use'
44
import { routes } from '.'
5+
import type { PersistentSettings } from '@src/static/types'
56
import Header from '@components/Header'
67
import { ENotificationAction } from '@src/static/types/enums'
78
import { useAppAPIContext } from '@src/store/context/api'
@@ -68,12 +69,13 @@ const AppRoutes = () => {
6869
createEffect(() => {
6970
useEventListener(window, 'blur', () => {
7071
// save the app settings to the persistent store
71-
const settings = {
72+
const settings: PersistentSettings = {
7273
user: connectedUserName(),
7374
enableNotifications: getEnableNotifications(),
7475
enableNotificationsSounds: getEnableNotificationsSounds(),
7576
globalNotificationsType: getGlobalNotificationsType(),
7677
enableMDNS: getEnableMDNS(),
78+
debugMode: 'info',
7779
scanForCamerasOnStartup: getScanForCamerasOnStartup(),
7880
}
7981
console.log('saving settings', settings)

GUI/ETVR/src/static/types/index.d.ts

+1
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ type PersistentSettings = {
5454
enableNotifications?: boolean
5555
globalNotificationsType?: ENotificationAction
5656
enableMDNS?: boolean
57+
debugMode?: 'off' | 'error' | 'warn' | 'info' | 'debug' | 'trace'
5758
scanForCamerasOnStartup?: boolean
5859
cameraSettings?: CameraSettings
5960
algorithmSettings?: AlgorithmSettings

0 commit comments

Comments
 (0)