GUI: support change log level when running (#153)

This commit is contained in:
Sijie.Sun
2024-07-06 17:18:13 +08:00
committed by GitHub
parent 571d4a6e8f
commit 7cfa850d4c
10 changed files with 444 additions and 40 deletions

View File

@@ -32,6 +32,14 @@ retain_network_instance: 保留网络实例
collect_network_infos: 收集网络信息
settings: 设置
exchange_language: Switch to English
logging: 日志
logging_level_info: 信息
logging_level_debug: 调试
logging_level_warn: 警告
logging_level_trace: 跟踪
logging_level_off: 关闭
logging_open_dir: 打开日志目录
logging_copy_dir: 复制日志路径
disable_auto_launch: 关闭开机自启
enable_auto_launch: 开启开机自启
exit: 退出

View File

@@ -32,6 +32,14 @@ retain_network_instance: Retain Network Instance
collect_network_infos: Collect Network Infos
settings: Settings
exchange_language: 切换中文
logging: Logging
logging_level_info: Info
logging_level_debug: Debug
logging_level_warn: Warn
logging_level_trace: Trace
logging_level_off: Off
logging_open_dir: Open Log Directory
logging_copy_dir: Copy Log Path
disable_auto_launch: Disable Launch on Reboot
enable_auto_launch: Enable Launch on Reboot
exit: Exit

View File

@@ -11,7 +11,7 @@ edition = "2021"
tauri-build = { version = "1", features = [] }
[dependencies]
tauri = { version = "1", features = [
tauri = { version = "1", features = [ "clipboard-all", "path-all",
"process-exit",
"system-tray",
"shell-open",

View File

@@ -8,9 +8,11 @@ use auto_launch::AutoLaunchBuilder;
use dashmap::DashMap;
use easytier::{
common::config::{
ConfigLoader, NetworkIdentity, PeerConfig, TomlConfigLoader, VpnPortalConfig,
ConfigLoader, FileLoggerConfig, NetworkIdentity, PeerConfig, TomlConfigLoader,
VpnPortalConfig,
},
launcher::{NetworkInstance, NetworkInstanceRunningInfo},
utils::{self, NewFilterSender},
};
use serde::{Deserialize, Serialize};
@@ -165,6 +167,9 @@ impl NetworkConfig {
static INSTANCE_MAP: once_cell::sync::Lazy<DashMap<String, NetworkInstance>> =
once_cell::sync::Lazy::new(DashMap::new);
static mut LOGGER_LEVEL_SENDER: once_cell::sync::Lazy<Option<NewFilterSender>> =
once_cell::sync::Lazy::new(Default::default);
// Learn more about Tauri commands at https://tauri.app/v1/guides/features/command
#[tauri::command]
fn parse_network_config(cfg: NetworkConfig) -> Result<String, String> {
@@ -222,6 +227,13 @@ fn set_auto_launch_status(app_handle: tauri::AppHandle, enable: bool) -> Result<
Ok(init_launch(&app_handle, enable).map_err(|e| e.to_string())?)
}
#[tauri::command]
fn set_logging_level(level: String) -> Result<(), String> {
let sender = unsafe { LOGGER_LEVEL_SENDER.as_ref().unwrap() };
sender.send(level).map_err(|e| e.to_string())?;
Ok(())
}
fn toggle_window_visibility(window: &Window) {
if window.is_visible().unwrap() {
window.hide().unwrap();
@@ -306,6 +318,7 @@ fn main() {
if !check_sudo() {
process::exit(0);
}
let quit = CustomMenuItem::new("quit".to_string(), "退出 Quit");
let hide = CustomMenuItem::new("hide".to_string(), "显示 Show / 隐藏 Hide");
let tray_menu = SystemTrayMenu::new()
@@ -314,13 +327,31 @@ fn main() {
.add_item(hide);
tauri::Builder::default()
.setup(|app| {
let Some(log_dir) = app.path_resolver().app_log_dir() else {
return Ok(());
};
let config = TomlConfigLoader::default();
config.set_file_logger_config(FileLoggerConfig {
dir: Some(log_dir.to_string_lossy().to_string()),
level: None,
file: None,
});
let Ok(Some(logger_reinit)) = utils::init_logger(config, true) else {
return Ok(());
};
unsafe { LOGGER_LEVEL_SENDER.replace(logger_reinit) };
Ok(())
})
.invoke_handler(tauri::generate_handler![
parse_network_config,
run_network_instance,
retain_network_instance,
collect_network_infos,
get_os_hostname,
set_auto_launch_status
set_auto_launch_status,
set_logging_level
])
.system_tray(SystemTray::new().with_menu(tray_menu))
.on_system_tray_event(|app, event| match event {

View File

@@ -14,10 +14,18 @@
"all": false,
"shell": {
"all": false,
"open": true
"open": ".*"
},
"process": {
"exit": true
},
"path": {
"all": true
},
"clipboard": {
"all": true,
"writeText": true,
"readText": true
}
},
"windows": [

View File

@@ -60,6 +60,7 @@ declare global {
const runNetworkInstance: typeof import('./composables/network')['runNetworkInstance']
const setActivePinia: typeof import('pinia')['setActivePinia']
const setAutoLaunchStatus: typeof import('./composables/network')['setAutoLaunchStatus']
const setLoggingLevel: typeof import('./composables/network')['setLoggingLevel']
const setMapStoreSuffix: typeof import('pinia')['setMapStoreSuffix']
const shallowReactive: typeof import('vue')['shallowReactive']
const shallowReadonly: typeof import('vue')['shallowReadonly']
@@ -151,6 +152,7 @@ declare module 'vue' {
readonly runNetworkInstance: UnwrapRef<typeof import('./composables/network')['runNetworkInstance']>
readonly setActivePinia: UnwrapRef<typeof import('pinia')['setActivePinia']>
readonly setAutoLaunchStatus: UnwrapRef<typeof import('./composables/network')['setAutoLaunchStatus']>
readonly setLoggingLevel: UnwrapRef<typeof import('./composables/network')['setLoggingLevel']>
readonly setMapStoreSuffix: UnwrapRef<typeof import('pinia')['setMapStoreSuffix']>
readonly shallowReactive: UnwrapRef<typeof import('vue')['shallowReactive']>
readonly shallowReadonly: UnwrapRef<typeof import('vue')['shallowReadonly']>
@@ -235,6 +237,7 @@ declare module '@vue/runtime-core' {
readonly runNetworkInstance: UnwrapRef<typeof import('./composables/network')['runNetworkInstance']>
readonly setActivePinia: UnwrapRef<typeof import('pinia')['setActivePinia']>
readonly setAutoLaunchStatus: UnwrapRef<typeof import('./composables/network')['setAutoLaunchStatus']>
readonly setLoggingLevel: UnwrapRef<typeof import('./composables/network')['setLoggingLevel']>
readonly setMapStoreSuffix: UnwrapRef<typeof import('pinia')['setMapStoreSuffix']>
readonly shallowReactive: UnwrapRef<typeof import('vue')['shallowReactive']>
readonly shallowReadonly: UnwrapRef<typeof import('vue')['shallowReadonly']>

View File

@@ -24,3 +24,7 @@ export async function getOsHostname() {
export async function setAutoLaunchStatus(enable: boolean) {
return await invoke<boolean>('set_auto_launch_status', { enable })
}
export async function setLoggingLevel(level: string) {
return await invoke('set_logging_level', { level })
}

View File

@@ -12,6 +12,11 @@ import type { NetworkConfig } from '~/types/network'
import { loadLanguageAsync } from '~/modules/i18n'
import { getAutoLaunchStatusAsync as getAutoLaunchStatus, loadAutoLaunchStatusAsync } from '~/modules/auto_launch'
import { loadRunningInstanceIdsFromLocalStorage } from '~/stores/network'
import { setLoggingLevel } from '~/composables/network'
import TieredMenu from 'primevue/tieredmenu'
import { open } from '@tauri-apps/api/shell'
import { appLogDir } from '@tauri-apps/api/path'
import { writeText } from '@tauri-apps/api/clipboard'
const { t, locale } = useI18n()
const visible = ref(false)
@@ -114,33 +119,66 @@ const activeStep = computed(() => {
return networkStore.networkInstanceIds.includes(networkStore.curNetworkId) ? 1 : 0
})
let current_log_level = 'off'
const setting_menu = ref()
const setting_menu_items = ref([
{
label: () => t('settings'),
items: [
{
label: () => t('exchange_language'),
icon: 'pi pi-language',
label: () => t('exchange_language'),
icon: 'pi pi-language',
command: async () => {
await loadLanguageAsync((locale.value === 'en' ? 'cn' : 'en'))
},
},
{
label: () => getAutoLaunchStatus() ? t('disable_auto_launch') : t('enable_auto_launch'),
icon: 'pi pi-desktop',
command: async () => {
await loadAutoLaunchStatusAsync(!getAutoLaunchStatus())
},
},
{
label: () => t('logging'),
icon: 'pi pi-file',
items: (function () {
const levels = ['off', 'warn', 'info', 'debug', 'trace']
let items = []
for (let level of levels) {
items.push({
label: () => t("logging_level_" + level) + (current_log_level === level ? ' ✓' : ''),
command: async () => {
current_log_level = level
await setLoggingLevel(level)
},
})
}
items.push({
separator: true,
})
items.push({
label: () => t('logging_open_dir'),
icon: 'pi pi-folder-open',
command: async () => {
await loadLanguageAsync((locale.value === 'en' ? 'cn' : 'en'))
console.log("open log dir", await appLogDir())
await open(await appLogDir())
},
},
{
label: () => getAutoLaunchStatus() ? t('disable_auto_launch') : t('enable_auto_launch'),
icon: 'pi pi-desktop',
})
items.push({
label: () => t('logging_copy_dir'),
icon: 'pi pi-tablet',
command: async () => {
await loadAutoLaunchStatusAsync(!getAutoLaunchStatus())
await writeText(await appLogDir())
},
},
{
label: () => t('exit'),
icon: 'pi pi-power-off',
command: async () => {
await exit(1)
},
},
],
})
return items
})()
},
{
label: () => t('exit'),
icon: 'pi pi-power-off',
command: async () => {
await exit(1)
},
},
])
@@ -231,7 +269,7 @@ function isRunning(id: string) {
<template #end>
<Button icon="pi pi-cog" class="mr-2" severity="secondary" aria-haspopup="true" :label="t('settings')"
aria-controls="overlay_setting_menu" @click="toggle_setting_menu" />
<Menu id="overlay_setting_menu" ref="setting_menu" :model="setting_menu_items" :popup="true" />
<TieredMenu id="overlay_setting_menu" ref="setting_menu" :model="setting_menu_items" :popup="true" />
</template>
</Toolbar>
</div>