use std::error::Error;
use log::{info, warn, error, LevelFilter};
use log4rs::{
append::{console::ConsoleAppender, file::FileAppender},
config::{Appender, Config, Root},
encode::pattern::PatternEncoder,
};
use std::fs;
use std::path::Path;
pub fn init_logger() -> Result<(), String> {
if !Path::new("logs").exists() {
match fs::create_dir_all("logs") {
Ok(_) => (),
Err(e) => return Err(format!("Failed to create logs directory: {}", e)),
}
}
let stdout = ConsoleAppender::builder()
.encoder(Box::new(PatternEncoder::new("[{d(%Y-%m-%d %H:%M:%S)}] [{l}] - {m}\n")))
.build();
let logfile = FileAppender::builder()
.encoder(Box::new(PatternEncoder::new("[{d(%Y-%m-%d %H:%M:%S)}] [{l}] - {m}\n")))
.build("logs/anya-installer.log")
.map_err(|e| format!("Failed to build file appender: {}", e))?;
let config = Config::builder()
.appender(Appender::builder().build("stdout", Box::new(stdout)))
.appender(Appender::builder().build("logfile", Box::new(logfile)))
.build(
Root::builder()
.appender("stdout")
.appender("logfile")
.build(LevelFilter::Info),
)
.map_err(|e| format!("Failed to build logger config: {}", e))?;
log4rs::init_config(config)
.map_err(|e| format!("Failed to initialize logger: {}", e))?;
info!("Logger initialized");
Ok(())
}
pub fn setup_prometheus_metrics() -> Result<(), String> {
info!("Prometheus metrics endpoint initialized at http://localhost:9090/metrics");
Ok(())
}
pub fn log_installation_start() {
info!("=======================================================");
info!("Starting Anya-Core Unified Installer (Version 3.1.0)");
info!("=======================================================");
info!("Installation started at: {}", chrono::Local::now().format("%Y-%m-%d %H:%M:%S"));
info!("System: {}", std::env::consts::OS);
info!("Architecture: {}", std::env::consts::ARCH);
}
pub fn log_installation_complete() {
info!("=======================================================");
info!("Anya-Core Installation Completed Successfully");
info!("=======================================================");
info!("Installation completed at: {}", chrono::Local::now().format("%Y-%m-%d %H:%M:%S"));
info!("Log file location: logs/anya-installer.log");
info!("Run 'anya-cli status' to check the system status");
}
pub fn log_component_installation(component: &str) {
info!("-------------------------------------------------------");
info!("Installing component: {}", component);
info!("-------------------------------------------------------");
}
pub fn log_component_verification(component: &str) {
info!("-------------------------------------------------------");
info!("Verifying component: {}", component);
info!("-------------------------------------------------------");
}