logger.rs 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. use chrono::Local;
  2. use std::{fs::{self, File}, process};
  3. const MAX_LOG_FILE_SIZE: u64 = 10_000_000; // 10 MB
  4. pub fn setup(is_debug: bool, log_trace: bool) -> Result<(), anyhow::Error> {
  5. let log_level = if log_trace {
  6. log::LevelFilter::Trace
  7. } else {
  8. log::LevelFilter::Info
  9. };
  10. let mut logger = fern::Dispatch::new()
  11. .format(|out, message, record| {
  12. out.finish(format_args!(
  13. "{}:{} [{}:{}] -- {}",
  14. Local::now().format("%H:%M:%S%.3f"),
  15. record.level(),
  16. record.file().unwrap_or("unknown"),
  17. record.line().unwrap_or(0),
  18. message
  19. ))
  20. })
  21. .level(log_level);
  22. if is_debug {
  23. logger = logger.chain(std::io::stdout());
  24. } else {
  25. let log_file_path = "output.log";
  26. let log_file = File::create(log_file_path)?;
  27. log_file.set_len(0)?;
  28. std::thread::spawn(move || {
  29. monitor_file_size(log_file_path, MAX_LOG_FILE_SIZE);
  30. });
  31. let log_file = fern::log_file(log_file_path)?;
  32. logger = logger.chain(log_file);
  33. }
  34. logger.apply()?;
  35. Ok(())
  36. }
  37. fn monitor_file_size(file_path: &str, max_size_bytes: u64) {
  38. loop {
  39. match fs::metadata(file_path) {
  40. Ok(metadata) => {
  41. if metadata.len() > max_size_bytes {
  42. eprintln!(
  43. "Things went south. Log file size caused panic exceeding {} MB",
  44. metadata.len() / 1_000_000,
  45. );
  46. process::exit(1);
  47. }
  48. }
  49. Err(err) => {
  50. eprintln!("Error reading log file metadata: {}", err);
  51. process::exit(1);
  52. }
  53. }
  54. std::thread::sleep(std::time::Duration::from_secs(30));
  55. }
  56. }