Skip to content

Commit 4e8f608

Browse files
committed
设置日志输出到文件,并把前端异常日志输出至此。
1 parent bfea6e8 commit 4e8f608

10 files changed

Lines changed: 72 additions & 18 deletions

File tree

Cargo.lock

Lines changed: 4 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

native/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
/gen/
22
/icons/
33
/data.db
4+
/logs/

native/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ endpoint = { path = "../crates/endpoint" }
2424
thiserror = "2.0.17"
2525
eyre = "0.6.12"
2626
log = "0.4.28"
27-
flexi_logger = "0.31.7"
27+
flexi_logger = { version = "0.31.7", features = ["json", "compress"] }
2828
parking_lot = "0.12.5"
2929
serde = { version = "1.0.228", features = ["derive"] }
3030
tokio = { version = "1.48.0", features = ["parking_lot", "fs", "sync"] }

native/src/error.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,3 +59,9 @@ impl From<String> for Error {
5959
Self::User { error: value }
6060
}
6161
}
62+
63+
#[tauri::command(rename_all = "snake_case")]
64+
pub async fn fatal_error(stack: Option<String>) -> Result<(), Error> {
65+
log::error!("{}", stack.unwrap_or("没有栈信息".to_string()));
66+
Ok(())
67+
}

native/src/lib.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,15 @@
11
mod endpoint;
22
mod error;
33
mod file_system;
4+
mod logger;
45
mod sqlite;
56
mod state;
67

78
use crate::state::State;
89

910
#[cfg_attr(mobile, tauri::mobile_entry_point)]
1011
pub fn run() {
11-
flexi_logger::Logger::with(flexi_logger::LogSpecification::info())
12-
.start()
13-
.unwrap();
14-
log::info!("日志开始记录");
12+
logger::init();
1513
#[allow(unused_mut)]
1614
let mut builder = tauri::Builder::default();
1715
#[cfg(all(desktop, not(debug_assertions)))]
@@ -44,6 +42,7 @@ pub fn run() {
4442
.plugin(tauri_plugin_opener::init())
4543
.manage(State::default())
4644
.invoke_handler(tauri::generate_handler![
45+
error::fatal_error,
4746
file_system::fs_remove_file,
4847
file_system::fs_read_file,
4948
file_system::fs_create_file,

native/src/logger.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
pub fn init() {
2+
flexi_logger::Logger::with(flexi_logger::LogSpecification::info())
3+
.log_to_file(
4+
flexi_logger::FileSpec::default()
5+
.directory("logs")
6+
.suppress_basename(),
7+
)
8+
.format(flexi_logger::json_format)
9+
.rotate(
10+
flexi_logger::Criterion::Age(flexi_logger::Age::Day),
11+
flexi_logger::Naming::Timestamps,
12+
flexi_logger::Cleanup::KeepCompressedFiles(7),
13+
)
14+
.start()
15+
.unwrap();
16+
log::info!("日志开始记录");
17+
}

src/lib/invoke/error.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { invoke } from "@tauri-apps/api/core";
2+
3+
export async function fatal_error(error: Error) {
4+
try {
5+
await invoke("fatal_error", {
6+
stack: error.stack,
7+
});
8+
} catch (error) {
9+
throw new Error(`${error}`);
10+
}
11+
}

src/routes/__root.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1+
import { Loading } from "@/components/loading";
12
import { createRootRoute, HeadContent, Outlet } from "@tanstack/react-router";
23

34
export const Route = createRootRoute({
4-
component: Component,
55
head: () => ({
66
meta: [{ title: "星链" }],
77
}),
8+
component: Component,
9+
pendingComponent: () => <Loading hint_text="正在初始化框架" mode="screen" />,
810
});
911
function Component() {
1012
return (

src/routes/boot.tsx

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,23 @@ import { createFileRoute, Outlet, useNavigate } from "@tanstack/react-router";
88
import { Loading } from "@/components/loading";
99
import { AppStore } from "./boot/app";
1010

11+
let tauri_error: typeof import("@/lib/invoke/error") | undefined;
12+
if (import.meta.env.TAURI_ENV_PLATFORM) {
13+
tauri_error = await import("@/lib/invoke/error");
14+
}
15+
1116
export const Route = createFileRoute("/boot")({
1217
component: Component,
1318
pendingComponent: () => {
1419
return <Loading hint_text="正在引导应用程序" mode="screen" />;
1520
},
21+
beforeLoad: () => {
22+
if (tauri_error) {
23+
self.onunhandledrejection = (e) => {
24+
tauri_error.fatal_error(e.reason);
25+
};
26+
}
27+
},
1628
});
1729
function Component() {
1830
const navigate = useNavigate();

src/routes/boot/app.tsx

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,9 @@ import { Sqlite } from "@/lib/sqlite";
6666
import { Errored } from "@/components/errored";
6767
import { Endpoint } from "@/lib/endpoint";
6868

69-
let window_api: typeof import("@tauri-apps/api/window") | undefined;
69+
let tauri_window: typeof import("@tauri-apps/api/window") | undefined;
7070
if (import.meta.env.TAURI_ENV_PLATFORM) {
71-
window_api = await import("@tauri-apps/api/window");
71+
tauri_window = await import("@tauri-apps/api/window");
7272
}
7373

7474
export const AppStore = createStore(
@@ -120,26 +120,28 @@ function Component() {
120120
}, []);
121121
//窗口配置
122122
useEffect(() => {
123-
if (window_api) {
123+
if (tauri_window) {
124124
const cleanup = (async () => {
125125
//设置窗口标题
126-
await window_api.getCurrentWindow().setTitle(document.title);
126+
await tauri_window.getCurrentWindow().setTitle(document.title);
127127
//同步标题变化
128128
const title_observer = new MutationObserver(
129129
async () =>
130-
await window_api.getCurrentWindow().setTitle(document.title),
130+
await tauri_window.getCurrentWindow().setTitle(document.title),
131131
);
132132
title_observer.observe(document.querySelector("title")!, {
133133
childList: true,
134134
characterData: true,
135135
});
136136
//设置窗口缩放状态
137-
set_is_maximized(await window_api.getCurrentWindow().isMaximized());
137+
set_is_maximized(await tauri_window.getCurrentWindow().isMaximized());
138138
//监控窗口缩放
139-
const un_on_resized = await window_api
139+
const un_on_resized = await tauri_window
140140
.getCurrentWindow()
141141
.onResized(async () =>
142-
set_is_maximized(await window_api.getCurrentWindow().isMaximized()),
142+
set_is_maximized(
143+
await tauri_window.getCurrentWindow().isMaximized(),
144+
),
143145
);
144146
return () => {
145147
title_observer.disconnect();
@@ -279,13 +281,13 @@ function Component() {
279281
</AlertDialog>
280282
</div>
281283
{/* 窗口控制按钮 */}
282-
{window_api && (
284+
{tauri_window && (
283285
<div data-tauri-drag-region className="flex-1 flex justify-end">
284286
<Button
285287
variant={"ghost"}
286288
className="rounded-none cursor-pointer"
287289
onClick={async () =>
288-
await window_api.getCurrentWindow().minimize()
290+
await tauri_window.getCurrentWindow().minimize()
289291
}
290292
>
291293
<Minimize2 />
@@ -294,7 +296,7 @@ function Component() {
294296
variant={"ghost"}
295297
className="rounded-none cursor-pointer"
296298
onClick={async () =>
297-
await window_api.getCurrentWindow().toggleMaximize()
299+
await tauri_window.getCurrentWindow().toggleMaximize()
298300
}
299301
>
300302
{!is_maximized ? <Maximize /> : <Minimize />}
@@ -303,7 +305,7 @@ function Component() {
303305
variant={"ghost"}
304306
className="rounded-none cursor-pointer hover:bg-red-600 hover:text-white active:bg-red-500"
305307
onClick={async () =>
306-
await window_api.getCurrentWindow().close()
308+
await tauri_window.getCurrentWindow().close()
307309
}
308310
>
309311
<X />

0 commit comments

Comments
 (0)