Skip to main content

tdm_server_rust/dev/
paths.rs

1//! dev 日志路径解析
2
3use crate::config::{resolve_config_dir, DevConsoleConfig};
4use std::path::{Path, PathBuf};
5
6/// 解析 error.log 所在目录(`DEV_LOG_DIR` > toml > `{TDM_CONFIG_DIR}/../logs`)
7pub fn resolve_log_dir(cfg: &DevConsoleConfig) -> PathBuf {
8    if let Ok(dir) = std::env::var("DEV_LOG_DIR") {
9        let trimmed = dir.trim();
10        if !trimmed.is_empty() {
11            return PathBuf::from(trimmed);
12        }
13    }
14    resolve_relative_or_absolute(&cfg.log_dir, default_log_dir())
15}
16
17/// 解析 error.log 完整路径
18pub fn resolve_error_log_path(cfg: &DevConsoleConfig) -> PathBuf {
19    resolve_log_dir(cfg).join("error.log")
20}
21
22/// 解析 app.log 路径(`DEV_APP_LOG` > toml)
23pub fn resolve_app_log_path(cfg: &DevConsoleConfig) -> PathBuf {
24    if let Ok(path) = std::env::var("DEV_APP_LOG") {
25        let trimmed = path.trim();
26        if !trimmed.is_empty() {
27            return PathBuf::from(trimmed);
28        }
29    }
30    resolve_relative_or_absolute(&cfg.app_log, default_app_log())
31}
32
33fn resolve_relative_or_absolute(configured: &str, fallback: PathBuf) -> PathBuf {
34    let p = PathBuf::from(configured);
35    if p.is_absolute() {
36        return p;
37    }
38    if configured.starts_with("./") || configured.starts_with(".\\") {
39        return PathBuf::from(env!("CARGO_MANIFEST_DIR")).join(&p);
40    }
41    if p.exists() {
42        return p;
43    }
44    fallback
45}
46
47fn default_log_dir() -> PathBuf {
48    let config_dir = resolve_config_dir();
49    config_dir
50        .parent()
51        .map(|p| p.join("logs"))
52        .unwrap_or_else(|| PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("logs"))
53}
54
55fn default_app_log() -> PathBuf {
56    let config_dir = resolve_config_dir();
57    config_dir
58        .parent()
59        .map(|p| p.join("app.log"))
60        .unwrap_or_else(|| PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("app.log"))
61}
62
63/// 文件大小人类可读
64pub fn file_size_label(path: &Path) -> String {
65    match std::fs::metadata(path) {
66        Ok(m) => format!("{} bytes", m.len()),
67        Err(e) => format!("不可读: {e}"),
68    }
69}