From c172efb6cd61efc13f52eeab4c0bde916d9c79fe Mon Sep 17 00:00:00 2001
From: ForgQi <34411314+ForgQi@users.noreply.github.com>
Date: Mon, 1 Dec 2025 02:18:20 +0800
Subject: [PATCH] Add dynamic log level configuration support
Introduces a new `loggers_level` field in the server config to allow dynamic adjustment of log levels via the API and UI. Updates the developer UI to reflect the new log level controls and ensures the backend applies changes to the logging filter at runtime. Also bumps the version to 1.1.27.
---
Cargo.lock | 4 ++--
Cargo.toml | 2 +-
app/ui/plugins/developer.tsx | 11 ++++++-----
crates/biliup-cli/src/server/api/endpoints.rs | 18 ++++++++++++++++--
crates/biliup-cli/src/server/config.rs | 2 ++
.../server/infrastructure/service_register.rs | 4 ++--
6 files changed, 29 insertions(+), 12 deletions(-)
diff --git a/Cargo.lock b/Cargo.lock
index d3aad4f..c85adf9 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -362,7 +362,7 @@ dependencies = [
[[package]]
name = "biliup-cli"
-version = "1.1.26"
+version = "1.1.27"
dependencies = [
"async-channel",
"async-trait",
@@ -3693,7 +3693,7 @@ checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596"
[[package]]
name = "stream-gears"
-version = "1.1.26"
+version = "1.1.27"
dependencies = [
"async-channel",
"async-trait",
diff --git a/Cargo.toml b/Cargo.toml
index 09bc53a..c7e4b1f 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -7,7 +7,7 @@ members = [
resolver = "3"
[workspace.package]
-version = "1.1.26"
+version = "1.1.27"
[workspace.dependencies]
serde = { version = "1.0", features = ["derive"] }
diff --git a/app/ui/plugins/developer.tsx b/app/ui/plugins/developer.tsx
index d750932..0cfac82 100644
--- a/app/ui/plugins/developer.tsx
+++ b/app/ui/plugins/developer.tsx
@@ -40,7 +40,7 @@ const Developer: React.FC = () => {
{
alignSelf: 'stretch',
padding: 0,
}}
- onChange={() => {
+ onChange={(value) => {
formApi.setValue('LOGGING.root.handlers', ['console'])
+ formApi.setValue('LOGGING.loggers.biliup.handlers', ['file'])
+ formApi.setValue('LOGGING.loggers.biliup.level', value)
}}
showClear={true}
>
@@ -60,8 +62,8 @@ const Developer: React.FC = () => {
CRITICAL
{
padding: 0,
}}
onChange={() => {
- formApi.setValue('LOGGING.loggers.biliup.handlers', ['file'])
}}
showClear={true}
>
diff --git a/crates/biliup-cli/src/server/api/endpoints.rs b/crates/biliup-cli/src/server/api/endpoints.rs
index ba894d2..43fb392 100644
--- a/crates/biliup-cli/src/server/api/endpoints.rs
+++ b/crates/biliup-cli/src/server/api/endpoints.rs
@@ -1,4 +1,3 @@
-use crate::UploadLine;
use crate::server::common::upload::{build_studio, submit_to_bilibili, upload};
use crate::server::common::util::Recorder;
use crate::server::config::Config;
@@ -18,6 +17,7 @@ use crate::server::infrastructure::repositories::{
del_streamer, get_all_streamer, get_upload_config,
};
use crate::server::infrastructure::service_register::ServiceRegister;
+use crate::{LogHandle, UploadLine};
use axum::Json;
use axum::extract::{Path, State};
use axum::http::StatusCode;
@@ -35,6 +35,7 @@ use std::time::{Duration, UNIX_EPOCH};
use tokio::fs;
use tokio::io::AsyncWriteExt;
use tracing::info;
+use tracing_subscriber::EnvFilter;
pub async fn get_streamers_endpoint(
State(pool): State,
@@ -182,6 +183,7 @@ pub async fn get_configuration(
pub async fn put_configuration(
State(config): State>>,
State(pool): State,
+ State(log_handle): State,
Json(json_data): Json,
) -> Result, Response> {
// 将 JSON 序列化为 TEXT 存库
@@ -260,7 +262,19 @@ pub async fn put_configuration(
.change_context(AppError::Unknown)
.map_err(report_to_response)?;
*config.write().unwrap() = saved_config;
- Ok(Json(config.read().unwrap().clone()))
+ let guard = config.read().unwrap();
+ if let Some(loggers_level) = &guard.loggers_level {
+ let new_filter = EnvFilter::try_new(loggers_level)
+ .change_context(AppError::Custom(String::from("Invalid log level format")))
+ .map_err(report_to_response)?;
+
+ log_handle
+ .modify(|filter| *filter = new_filter)
+ .change_context(AppError::Unknown)
+ .map_err(report_to_response)?;
+ }
+
+ Ok(Json(guard.clone()))
}
pub async fn get_streamer_info(
diff --git a/crates/biliup-cli/src/server/config.rs b/crates/biliup-cli/src/server/config.rs
index 660d0d1..3f4faeb 100644
--- a/crates/biliup-cli/src/server/config.rs
+++ b/crates/biliup-cli/src/server/config.rs
@@ -215,6 +215,8 @@ pub struct Config {
/// 用户Cookie配置
#[serde(default)]
pub user: Option,
+
+ pub loggers_level: Option,
}
/// 主播配置结构体
diff --git a/crates/biliup-cli/src/server/infrastructure/service_register.rs b/crates/biliup-cli/src/server/infrastructure/service_register.rs
index 4916735..ef341a4 100644
--- a/crates/biliup-cli/src/server/infrastructure/service_register.rs
+++ b/crates/biliup-cli/src/server/infrastructure/service_register.rs
@@ -25,8 +25,8 @@ pub struct ServiceRegister {
pub config: Arc>,
/// HTTP客户端
pub client: StatelessClient,
- #[from_ref(skip)]
- log_handle: LogHandle,
+
+ pub log_handle: LogHandle,
}
/// 简单的服务容器,负责管理API端点通过axum扩展获取的各种服务