lib.rs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. //! A logger that prints all messages with a readable output format.
  2. extern crate log;
  3. extern crate chrono;
  4. #[cfg(feature = "colored")] extern crate colored;
  5. #[cfg(feature = "colored")] use colored::*;
  6. use log::{Log,Level,Metadata,Record,SetLoggerError};
  7. use chrono::Local;
  8. struct SimpleLogger {
  9. level: Level,
  10. }
  11. impl Log for SimpleLogger {
  12. fn enabled(&self, metadata: &Metadata) -> bool {
  13. metadata.level() <= self.level
  14. }
  15. fn log(&self, record: &Record) {
  16. if self.enabled(record.metadata()) {
  17. let level_string = {
  18. #[cfg(feature = "colored")] {
  19. match record.level() {
  20. Level::Error => record.level().to_string().red(),
  21. Level::Warn => record.level().to_string().yellow(),
  22. Level::Info => record.level().to_string().cyan(),
  23. Level::Debug => record.level().to_string().purple(),
  24. Level::Trace => record.level().to_string().normal(),
  25. }
  26. }
  27. #[cfg(not(feature = "colored"))] {
  28. record.level().to_string()
  29. }
  30. };
  31. let target = if record.target().len() > 0 {
  32. record.target()
  33. } else {
  34. record.module_path().unwrap_or_default()
  35. };
  36. println!(
  37. "{} {:<5} [{}] {}",
  38. Local::now().format("%Y-%m-%d %H:%M:%S,%3f"),
  39. level_string,
  40. target,
  41. record.args());
  42. }
  43. }
  44. fn flush(&self) {
  45. }
  46. }
  47. /// Initializes the global logger with a SimpleLogger instance with
  48. /// `max_log_level` set to a specific log level.
  49. ///
  50. /// ```
  51. /// # #[macro_use] extern crate log;
  52. /// # extern crate simple_logger;
  53. /// #
  54. /// # fn main() {
  55. /// simple_logger::init_with_level(log::Level::Warn).unwrap();
  56. ///
  57. /// warn!("This is an example message.");
  58. /// info!("This message will not be logged.");
  59. /// # }
  60. /// ```
  61. pub fn init_with_level(level: Level) -> Result<(), SetLoggerError> {
  62. let logger = SimpleLogger { level };
  63. log::set_boxed_logger(Box::new(logger))?;
  64. log::set_max_level(level.to_level_filter());
  65. Ok(())
  66. }
  67. /// Initializes the global logger with a SimpleLogger instance with
  68. /// `max_log_level` set to `LogLevel::Trace`.
  69. ///
  70. /// ```
  71. /// # #[macro_use] extern crate log;
  72. /// # extern crate simple_logger;
  73. /// #
  74. /// # fn main() {
  75. /// simple_logger::init().unwrap();
  76. /// warn!("This is an example message.");
  77. /// # }
  78. /// ```
  79. pub fn init() -> Result<(), SetLoggerError> {
  80. init_with_level(Level::Trace)
  81. }