logging.rs 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. use std::path::PathBuf;
  2. use std::time::SystemTime;
  3. use rand::Rng;
  4. #[macro_export]
  5. macro_rules! init_test_log {
  6. () => {
  7. $crate::init_log(stdext::function_name!()).unwrap()
  8. };
  9. }
  10. pub const LOG_DIR: &str = "/tmp/ruaft-test-logs/";
  11. pub fn init_log(module: &str) -> std::io::Result<PathBuf> {
  12. let module_file = module.replace("::", "-");
  13. let timestamp = SystemTime::now()
  14. .duration_since(SystemTime::UNIX_EPOCH)
  15. .map(|d| d.as_secs())
  16. .unwrap_or(0);
  17. let suffix: String = rand::thread_rng()
  18. .sample_iter(&rand::distributions::Alphanumeric)
  19. .take(10)
  20. .map(char::from)
  21. .collect();
  22. let log_file_name =
  23. format!("{}-{:010}-{}.log", module_file, timestamp, suffix);
  24. let log_dir = option_env!("LOG_DIR").unwrap_or(LOG_DIR);
  25. let mut path = PathBuf::from(log_dir);
  26. std::fs::create_dir_all(path.as_path())?;
  27. path.push(log_file_name);
  28. let log_file = std::fs::File::create(path.as_path())?;
  29. {
  30. let mut latest_path = path.clone();
  31. latest_path.pop();
  32. latest_path.push(format!("{}-latest", module_file));
  33. let _ = std::fs::remove_file(latest_path.as_path());
  34. #[cfg(unix)]
  35. let _ = std::os::unix::fs::symlink(path.as_path(), latest_path);
  36. #[cfg(windows)]
  37. let _ = std::os::windows::fs::symlink_file(path.as_path(), latest_path);
  38. }
  39. let module = match module.rfind("::") {
  40. Some(pos) => &module[..pos],
  41. None => &module,
  42. };
  43. let env = env_logger::Env::default().default_filter_or("info");
  44. let logger = env_logger::Builder::from_env(env)
  45. .target(env_logger::Target::Pipe(Box::new(log_file)))
  46. .filter(Some(module), log::LevelFilter::Trace)
  47. .format_timestamp_millis()
  48. .is_test(true)
  49. .build();
  50. crate::thread_local_logger::thread_init(logger);
  51. Ok(path)
  52. }