logger.rs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. // SPDX-FileCopyrightText: 2024 Christina Sørensen
  2. // SPDX-License-Identifier: EUPL-1.2
  3. //
  4. // SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors
  5. // SPDX-FileCopyrightText: 2014 Benjamin Sago
  6. // SPDX-License-Identifier: MIT
  7. //! Debug error logging.
  8. use std::ffi::OsStr;
  9. use nu_ansi_term::{AnsiString as ANSIString, Color as Colour};
  10. /// Sets the internal logger, changing the log level based on the value of an
  11. /// environment variable.
  12. pub fn configure<T: AsRef<OsStr>>(ev: Option<T>) {
  13. let Some(ev) = ev else { return };
  14. let env_var = ev.as_ref();
  15. if env_var.is_empty() {
  16. return;
  17. }
  18. if env_var == "trace" {
  19. log::set_max_level(log::LevelFilter::Trace);
  20. } else {
  21. log::set_max_level(log::LevelFilter::Debug);
  22. }
  23. let result = log::set_logger(GLOBAL_LOGGER);
  24. if let Err(e) = result {
  25. eprintln!("Failed to initialize logger: {e}");
  26. }
  27. }
  28. #[derive(Debug)]
  29. struct Logger;
  30. const GLOBAL_LOGGER: &Logger = &Logger;
  31. impl log::Log for Logger {
  32. fn enabled(&self, _: &log::Metadata<'_>) -> bool {
  33. true // no need to filter after using ‘set_max_level’.
  34. }
  35. fn log(&self, record: &log::Record<'_>) {
  36. let open = Colour::Fixed(243).paint("[");
  37. let level = level(record.level());
  38. let close = Colour::Fixed(243).paint("]");
  39. eprintln!(
  40. "{}{} {}{} {}",
  41. open,
  42. level,
  43. record.target(),
  44. close,
  45. record.args()
  46. );
  47. }
  48. fn flush(&self) {
  49. // no need to flush with ‘eprintln!’.
  50. }
  51. }
  52. fn level(level: log::Level) -> ANSIString<'static> {
  53. #[rustfmt::skip]
  54. return match level {
  55. log::Level::Error => Colour::Red.paint("ERROR"),
  56. log::Level::Warn => Colour::Yellow.paint("WARN"),
  57. log::Level::Info => Colour::Cyan.paint("INFO"),
  58. log::Level::Debug => Colour::Blue.paint("DEBUG"),
  59. log::Level::Trace => Colour::Fixed(245).paint("TRACE"),
  60. };
  61. }