1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
use chrono::prelude::*;
use std::fs::{OpenOptions};
use std::io::{BufReader, BufRead, Write, Seek, SeekFrom};
use std::env;
pub fn log(s: &str) {
let path = std::env::current_exe().unwrap();
let filename = std::path::Path::new(&path).file_name().unwrap().to_str().unwrap();
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, filename);
} else {
path = format!("{}/.wei/{}.log.txt", home_dir, filename);
}
let local: DateTime<Local> = Local::now();
let data = format!("{} {}",local.format("%Y-%m-%d %H:%M"), s);
// let _ = write_and_prune_file(&path, &data, 100);
// 往文件后面追加,并限制文件最多300行
let mut file = OpenOptions::new().read(true).write(true).create(true).open(&path).unwrap();
let reader = BufReader::new(&file);
let mut lines: Vec<String> = reader.lines().collect::<Result<_, _>>().unwrap();
if lines.len() >= 100 {
lines.remove(lines.len() - 1);
}
lines.insert(0, data);
file.seek(SeekFrom::Start(0)).unwrap();
file.set_len(0).unwrap(); // Truncate the file
for line in &lines {
writeln!(file, "{}", line).unwrap();
}
}
#[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()
}
}
// 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)?;
// // Step 1: Read all lines
// let reader = BufReader::new(&file);
// let mut lines: Vec<String> = reader.lines().collect::<Result<_, _>>()?;
// // Step 2: Prune lines if necessary
// if lines.len() >= max_lines {
// lines.remove(lines.len() - 1);
// }
// // Step 3: Insert new line at the top
// lines.insert(0, content.to_string());
// // Step 4: Seek to the start of the file and write all lines
// file.seek(SeekFrom::Start(0))?;
// file.set_len(0)?; // Truncate the file
// for line in &lines {
// writeln!(file, "{}", line)?;
// }
// Ok(())
// }
// #[cfg(test)]
// mod tests {
// use super::*;
// #[test]
// fn it_works() {
// let result = add(2, 2);
// assert_eq!(result, 4);
// }
// }