use chrono::prelude::*;
pub fn log(s: &str) {
let home_dir = get_home_dir().unwrap_or_else(|| String::from("."));
let path;
if cfg!(target_os = "windows") {
path = format!("{}/AppData/Local/wei/log.txt", home_dir);
} else {
path = format!("/var/log/wei-log.txt");
}
let local: DateTime<Local> = Local::now();
let data = format!("{} {}",local.format("%Y-%m-%d %H:%M"), s);
let _ = write_and_prune_file(&path, &data, 5000);
}
#[macro_export]
macro_rules! info {
($($arg:tt)*) => {{
let message = format!($($arg)*);
crate::wei_log::log(&message); println!("{}", message);
}}
}
#[macro_export]
macro_rules! error {
($($arg:tt)*) => {{
let message = format!($($arg)*);
let message = format!("错误: {}", message);
crate::wei_log::log(&message); println!("{}", message);
}}
}
#[macro_export]
macro_rules! info_println {
($($arg:tt)*) => {{
let message = format!($($arg)*);
crate::wei_log::log(&message); println!("{}", message);
}}
}
#[macro_export]
macro_rules! info_print {
($($arg:tt)*) => {{
let message = format!($($arg)*);
crate::wei_log::log(&message); print!("{}", message);
}}
}
fn get_home_dir() -> Option<String> {
if cfg!(target_os = "windows") {
env::var("USERPROFILE").ok()
} else {
env::var("HOME").ok()
}
}
use std::fs::{OpenOptions};
use std::io::{BufReader, BufRead, Write, Seek, SeekFrom};
use std::env;
fn write_and_prune_file(path: &str, content: &str, max_lines: usize) -> std::io::Result<()> {
let mut file = OpenOptions::new().read(true).write(true).create(true).open(path)?;
let reader = BufReader::new(&file);
let mut lines: Vec<String> = reader.lines().collect::<Result<_, _>>()?;
if lines.len() >= max_lines {
lines.remove(lines.len() - 1);
}
lines.insert(0, content.to_string());
file.seek(SeekFrom::Start(0))?;
file.set_len(0)?; for line in &lines {
writeln!(file, "{}", line)?;
}
Ok(())
}