feat: 后台服务模式 + 日志滚动 + 修复 llm_usage 表兼容性

- 新增 logger.rs(tracing-appender,日滚日志,.data/logs/)
- service 子命令:等同 listen --llm 但日志同时写入文件
- systemd/ias.service 单元文件
- 迁移 0007:ALTER TABLE llm_usage ADD COLUMN IF NOT EXISTS
  修复与 iPet 旧表的结构冲突
- ias usage 命令可正常查询 Token 统计
- 日志滚动保留 7 天,自动删除旧文件
This commit is contained in:
2026-06-01 17:45:17 +08:00
parent b9de3665d9
commit 00002e4740
13 changed files with 341 additions and 45 deletions
+17 -9
View File
@@ -3,6 +3,7 @@ mod config;
mod context;
mod db;
mod llm;
mod logger;
mod scheduler;
mod state;
mod tools;
@@ -24,12 +25,9 @@ use wechat::client::WeChatClient;
#[tokio::main]
async fn main() {
tracing_subscriber::fmt()
.with_env_filter(
EnvFilter::try_from_default_env()
.unwrap_or_else(|_| EnvFilter::new("info")),
)
.init();
let cli = Cli::parse();
let is_service = matches!(cli.command, Commands::Service);
logger::init_logger(Some(".data/logs"), is_service);
dotenvy::dotenv().ok();
@@ -54,8 +52,6 @@ async fn main() {
// 文件状态管理器(降级方案)
let file_state = state::StateManager::new(&config.storage.state_dir);
let cli = Cli::parse();
match cli.command {
Commands::Login { timeout } => {
cmd_login(timeout, &database, &file_state).await;
@@ -79,6 +75,9 @@ async fn main() {
Commands::Usage { since, until, model } => {
cmd_usage(&database, since, until, model).await;
}
Commands::Service => {
cmd_listen(true, false, &database, &file_state, &config, &memory_store).await
}
}
}
@@ -258,7 +257,16 @@ async fn cmd_listen(
// 创建 Conversation
let mut conv = match Conversation::new(cfg) {
Ok(c) => {
Ok(mut c) => {
// 设置 db_pool 并加载历史消息
if let Some(db) = database {
let session = c.session();
{
let mut s = session.lock().await;
s.db_pool = Some(Arc::new(db.pool().clone()));
s.load_recent_messages(20).await;
}
}
info!("LLM 已初始化: {} / {}", c.provider_name(), c.model());
c
}