1use backtrace::Backtrace;
2use chrono::Local;
3use std::thread;
4pub fn log(message: &str) {
5 log_base(message);
6}
7
8fn get_caller_function() -> String {
9 let bt = Backtrace::new();
10
11 let frames = bt.frames();
12 for frame in frames.iter().skip(7) {
13 if let Some(sym) = frame.symbols().first() {
14 if let Some(name) = sym.name() {
15 let name = name.to_string();
16 if !name.starts_with("std::") && !name.starts_with("core::") {
18 let name_iter = name.split("::");
20 let func_name = name_iter.skip(1).next();
21 if let Some(clean_name) = func_name {
22 return clean_name.to_string();
23 }
24 return name;
25 }
26 }
27 }
28 }
29 "unknown".to_string()
30}
31
32pub fn log_base(message: &str) {
33 let thread_name = thread::current().name().unwrap_or("unnamed").to_string();
34 let caller = get_caller_function();
35 let prefix = format!("{}-{}", thread_name, caller);
36 let current_time = Local::now().format("%Y-%m-%d %H:%M:%S");
37
38 println!("[{}]{}: {}", current_time, prefix, message);
39}