From ebd90ca352eeebec434ef50e5cc3e377fbc7ff0c Mon Sep 17 00:00:00 2001 From: lifegpc Date: Thu, 2 Jan 2025 23:06:38 +0800 Subject: [PATCH] feat: Add log optimization option and enhance logging configuration --- api.yml | 6 ++++++ config.ts | 6 ++++++ main.ts | 2 +- routes/api/log.ts | 4 +++- server.ts | 2 +- utils/logger.ts | 15 ++++++++++++--- 6 files changed, 29 insertions(+), 6 deletions(-) diff --git a/api.yml b/api.yml index 2dcbfd9..7f64e23 100644 --- a/api.yml +++ b/api.yml @@ -2635,6 +2635,12 @@ paths: type: string format: date-time description: End time for log deletion + - name: optimize + in: query + schema: + type: boolean + default: true + description: Whether to optimize the log after clearing responses: "200": description: OK diff --git a/config.ts b/config.ts index abda194..b21631e 100644 --- a/config.ts +++ b/config.ts @@ -41,6 +41,8 @@ export type ConfigType = { max_import_img_count: number; enable_server_timing: boolean; thumbnail_format: ThumbnailFormat; + /** Enable logging stack for all log levels */ + logging_stack: boolean; }; export enum ThumbnailMethod { @@ -254,6 +256,9 @@ export class Config { get enable_server_timing() { return this._return_bool("enable_server_timing") ?? false; } + get logging_stack() { + return this._return_bool("logging_stack") ?? false; + } to_json(): ConfigType { return { cookies: typeof this.cookies === "string", @@ -294,6 +299,7 @@ export class Config { max_import_img_count: this.max_import_img_count, enable_server_timing: this.enable_server_timing, thumbnail_format: this.thumbnail_format, + logging_stack: this.logging_stack, }; } } diff --git a/main.ts b/main.ts index b2cdc15..b7741b4 100644 --- a/main.ts +++ b/main.ts @@ -74,7 +74,7 @@ if (cmd == CMD.Unknown) { } const settings = await load_settings(args.config); -await base_logger.init(settings.db_path || settings.base); +await base_logger.init(settings); if (!check_file_permissions(settings.base)) { throw Error("Can not aceess download loaction."); } diff --git a/routes/api/log.ts b/routes/api/log.ts index e5d1d6b..d186d53 100644 --- a/routes/api/log.ts +++ b/routes/api/log.ts @@ -1,7 +1,7 @@ import { Handlers } from "$fresh/server.ts"; import { return_data, return_error } from "../../server/utils.ts"; import { User, UserPermission } from "../../db.ts"; -import { get_string, parse_int } from "../../server/parse_form.ts"; +import { get_string, parse_bool, parse_int } from "../../server/parse_form.ts"; import { base_logger, LogLevel } from "../../utils/logger.ts"; export const handler: Handlers = { @@ -33,7 +33,9 @@ export const handler: Handlers = { base_logger.log("Failed to parse end_time:", e); return return_error(1, "Failed to parse end_time."); } + const optimize = await parse_bool(form.get("optimize"), true); base_logger.clear(typ, min_level, max_level, deleted_level, end_time); + if (optimize) base_logger.optimize(); return return_data(true); }, async GET(req, ctx) { diff --git a/server.ts b/server.ts index c57eeeb..f1ac3b1 100644 --- a/server.ts +++ b/server.ts @@ -30,7 +30,7 @@ const renderFn: RenderFunction = (ctx, render) => { export async function startServer(path: string) { cfg_path = path; const cfg = await load_settings(path); - await base_logger.init(cfg.db_path || cfg.base); + await base_logger.init(cfg); task_manager = new TaskManager(cfg); await task_manager.init(); task_manager.run(true).catch((e) => { diff --git a/utils/logger.ts b/utils/logger.ts index 3f85038..8d7aafd 100644 --- a/utils/logger.ts +++ b/utils/logger.ts @@ -1,5 +1,6 @@ import { join } from "@std/path"; import { format as format_ver, parse as parse_ver } from "@std/semver"; +import type { Config } from "../config.ts"; import { parse_bool, stackTrace } from "../utils.ts"; import { Db, QueryParameterSet, SqliteMaster } from "./db_interface.ts"; @@ -60,10 +61,13 @@ export function format_message( class BaseLogger { db?: Db; + #cfg?: Config; #exist_table: Set = new Set(); #use_ffi = false; readonly version = parse_ver("1.0.0-0"); - async init(base_path: string) { + async init(cfg: Config) { + this.#cfg = cfg; + const base_path = cfg.db_path || cfg.base; const db_path = join(base_path, "logs.db"); this.#use_ffi = parse_bool(Deno.env.get("DB_USE_FFI") ?? "false"); if (this.#use_ffi) { @@ -133,9 +137,10 @@ class BaseLogger { } add(type: string, level: number, ...messages: unknown[]) { this.#fallback(type, level, ...messages); - if (!this.db) return; + if (!this.db || !this.#cfg) return; const message = format_message(messages); - const stack = (level >= LogLevel.Trace && level < LogLevel.Debug) || + const stack = this.#cfg.logging_stack || + (level >= LogLevel.Trace && level < LogLevel.Debug) || level >= LogLevel.Warn ? stackTrace(2) : undefined; @@ -360,6 +365,10 @@ class BaseLogger { log(type: string, ...messages: unknown[]) { this.add(type, LogLevel.Log, ...messages); } + optimize() { + if (!this.db) return; + this.db.query("VACUUM;"); + } trace(type: string, ...messages: unknown[]) { this.add(type, LogLevel.Trace, ...messages); }