feat(m188): launcher.log 早落盘 + 会话日志搬到 logs/game(旧家只读兼容)
用户投诉原话:「我们的启动日志放在哪?…他找半天没找到崩溃日志」「只有一个安装日志」。 启动器运行日志(.ULL/logs/launcher.log) - presenter 构造 HostEnv 时就登记日志目录:启动早期缓冲的 200 行([probe]/[font]/[theme]) 当场刷盘,不再是「只有开过一局游戏才有日志」。 - app/** 里所有 eprintln! 诊断改走 app::diag::diag!(stderr + 文件双写,行首 [tag] 即 scope), 含 boot/boot::fallback/state/update 各线。 - boot 那一拍补一行后端事实(request/effective/fallback)。 - 滚动上限(1 MiB → launcher.1.log,只留一份)写进 README 与 docs/logs-location.md。 会话日志搬家:data/agent/sessions → logs - LauncherLayout: sessions_root()/game_logs() 新增,agent_sessions() 降级为只读兼容。 - host/logs 与 cli/commands/sessions 两个根合并(同 id 新根优先),event_path 回落旧家。 - 不搬不删;日志目录写一份 session-log-location.json 记录(moved=0, policy=read-only-compat)。 入口与文案 - 设置页「通用」新增「日志文件夹」行:路径 + 打开目录 + 复制路径(i18n 中英)。 - 日志页页头的「打开目录」不再是占位:走 M187 的 open_dir,失败文本带路径并送进剪贴板。 - README.md / README.zh-CN.md 新增「日志在哪」章节(含 crash-reports 只在游戏走到那一步才有), docs/logs-location.md 给出上限、双写判据、迁移策略与没验的部分。 守门(每条都有变异证明,见报告) - 旧家会话仍列得出/打不开 ⇒ 只读新根变红;新会话写 logs/game ⇒ 只读旧根、写回旧家都变红。 - launcher.log 滚动 ⇒ 干掉 rename 变红。 - 打开日志文件夹指向真实目录 ⇒ 换成 cache/ 或去掉 create_dir_all 都变红。 - 日志根随三模式变化 ⇒ 把 HostEnv::logs_dir 写死成便携落点变红。
This commit is contained in:
1 parent
efc663a3cb
commit
5fd5cd47dc
47 files changed
+1371
-119
No files matched your search
@@ -25,6 +25,7 @@
|
||||
//!
|
||||
//! 两条时钟不会同时干活:心跳在 `needs_frames()` 为真时**只续排、不推进**,忙碌结束自动接回。
|
||||
|
||||
use crate::app::diag::diag;
|
||||
use std::time::Instant;
|
||||
|
||||
use iced::{window, Task};
|
||||
@@ -88,7 +89,7 @@ impl App {
|
||||
match hwnd {
|
||||
Some(_) => self.apply_window_alpha("boot"),
|
||||
None => {
|
||||
eprintln!("[appearance] hwnd=none(拿不到窗口句柄:整窗 α 无法下发)");
|
||||
diag!("[appearance] hwnd=none(拿不到窗口句柄:整窗 α 无法下发)");
|
||||
self.log_appearance("boot", None);
|
||||
}
|
||||
}
|
||||
@@ -102,7 +103,7 @@ impl App {
|
||||
iced::theme::Mode::Dark => SchemeFlavor::Dark,
|
||||
iced::theme::Mode::None | iced::theme::Mode::Light => SchemeFlavor::Light,
|
||||
};
|
||||
eprintln!("[theme] 系统主题 = {mode:?}");
|
||||
diag!("[theme] 系统主题 = {mode:?}");
|
||||
// 优先级:`--theme` > 配置文件里的 `appearance.theme_mode` > 系统。
|
||||
// 早先这里无条件盖掉,于是「配置文件写 dark、系统是浅色」会出现
|
||||
// `light -> dark -> light` 的一次抖动,配置永远不生效(M90 r3 顺手修)。
|
||||
@@ -169,7 +170,7 @@ impl App {
|
||||
Message::Captured(screenshot) => self.on_captured(&screenshot),
|
||||
Message::Demo(message) => {
|
||||
// gallery 只是 harness:按下只打日志,不接业务(组件库要能脱离业务验收)
|
||||
eprintln!("[gallery] {} pressed", message.id());
|
||||
diag!("[gallery] {} pressed", message.id());
|
||||
Task::none()
|
||||
}
|
||||
}
|
||||
@@ -187,7 +188,7 @@ impl App {
|
||||
// 本 crate 不直接依赖 core,所以经 `unlucky_cli`(已是本 crate 的依赖)出面,
|
||||
// 免得 UI 侧把判据重算一遍、两份口径漂。日后看日志能一眼分辨
|
||||
// 「没配置」与「配了但登录失败」。
|
||||
eprintln!("{}", unlucky_cli::commands::msa_client_id_log_line());
|
||||
diag!("{}", unlucky_cli::commands::msa_client_id_log_line());
|
||||
|
||||
// 主题优先级:显式 `--theme` / `--screenshot-theme` > 设置文件 > 系统。
|
||||
// 截图通道**不读设置文件**(D30 可复现:同一份代码在两台机器上要出同一张图)。
|
||||
@@ -218,7 +219,7 @@ impl App {
|
||||
// 取证开关 `ULL_START_ROUTE`:截图/冒烟直接落到某一页(`cli.rs` 不在本 mission 的 scope,
|
||||
// 而「外观」分组只在设置页上,出矩阵必须能直达)。未知值忽略。
|
||||
if let Some(route) = boot_env::env_start_route() {
|
||||
eprintln!("[boot] ULL_START_ROUTE → {route:?}");
|
||||
diag!("[boot] ULL_START_ROUTE → {route:?}");
|
||||
self.state.navigate(route);
|
||||
// 直达某一页时不要再被「自动选中第一条实例」拉回详情页。
|
||||
self.auto_selected = true;
|
||||
@@ -228,7 +229,7 @@ impl App {
|
||||
account::force_account_state(self);
|
||||
// M187:启动失败弹窗的取证夹具(`ULL_DIALOG_FIXTURE`),必须在 `refresh_view` 之前。
|
||||
if let Some(mode) = dialog_fixture::apply(self) {
|
||||
eprintln!("[boot] ULL_DIALOG_FIXTURE → {mode}");
|
||||
diag!("[boot] ULL_DIALOG_FIXTURE → {mode}");
|
||||
}
|
||||
|
||||
self.auto_select();
|
||||
@@ -287,9 +288,9 @@ impl App {
|
||||
};
|
||||
match crate::shot::save(screenshot, &path) {
|
||||
Ok(summary) => {
|
||||
eprintln!("{}", summary.describe());
|
||||
diag!("{}", summary.describe());
|
||||
// M97:打**实际**后端名(`wgpu`/`tiny-skia`),不是请求值——`renderer=auto` 曾经出现在每张验收图的日志里。
|
||||
eprintln!(
|
||||
diag!(
|
||||
"[shot] screen={} theme={} renderer={} route={:?}",
|
||||
self.options.screen.name(),
|
||||
crate::shot::flavor_slug(&self.ui),
|
||||
@@ -297,7 +298,7 @@ impl App {
|
||||
self.state.route()
|
||||
);
|
||||
}
|
||||
Err(error) => eprintln!("[shot] 失败:{error}"),
|
||||
Err(error) => diag!("[shot] 失败:{error}"),
|
||||
}
|
||||
|
||||
iced::exit()
|
||||
|
||||
Reference in new issue
Block a user