lib.rs 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. use log::LevelFilter;
  2. use std::path::Path;
  3. use tracing::subscriber::set_global_default;
  4. use tracing_bunyan_formatter::{BunyanFormattingLayer, JsonStorageLayer};
  5. use tracing_log::LogTracer;
  6. use tracing_subscriber::{layer::SubscriberExt, EnvFilter};
  7. pub struct FlowyLogBuilder {
  8. name: String,
  9. env_filter: String,
  10. directory: String,
  11. }
  12. impl FlowyLogBuilder {
  13. pub fn new(name: &str, directory: impl AsRef<Path>) -> Self {
  14. let directory = directory.as_ref().to_str().unwrap().to_owned();
  15. FlowyLogBuilder {
  16. name: name.to_owned(),
  17. env_filter: "Info".to_owned(),
  18. directory,
  19. }
  20. }
  21. pub fn env_filter(mut self, env_filter: &str) -> Self {
  22. self.env_filter = env_filter.to_owned();
  23. self
  24. }
  25. pub fn build(self) -> std::result::Result<(), String> {
  26. let env_filter = EnvFilter::new(self.env_filter);
  27. let subscriber = tracing_subscriber::fmt()
  28. .with_target(false)
  29. .with_max_level(tracing::Level::TRACE)
  30. .with_writer(std::io::stderr)
  31. .with_thread_ids(false)
  32. .with_target(false)
  33. // .with_writer(non_blocking)
  34. .compact()
  35. .finish()
  36. .with(env_filter);
  37. if cfg!(feature = "use_bunyan") {
  38. let formatting_layer = BunyanFormattingLayer::new(self.name.clone(), std::io::stdout);
  39. let local_file_name = format!("{}.log", &self.name);
  40. let file_appender =
  41. tracing_appender::rolling::daily(self.directory.clone(), local_file_name);
  42. let (_non_blocking, _guard) = tracing_appender::non_blocking(file_appender);
  43. let _ = set_global_default(subscriber.with(JsonStorageLayer).with(formatting_layer))
  44. .map_err(|e| format!("{:?}", e))?;
  45. } else {
  46. let _ = set_global_default(subscriber).map_err(|e| format!("{:?}", e))?;
  47. }
  48. let _ = LogTracer::builder()
  49. .with_max_level(LevelFilter::Trace)
  50. .init()
  51. .map_err(|e| format!("{:?}", e))
  52. .unwrap();
  53. Ok(())
  54. }
  55. }
  56. pub fn init_log(name: &str, directory: &str, env_filter: &str) -> std::result::Result<(), String> {
  57. FlowyLogBuilder::new(name, directory)
  58. .env_filter(env_filter)
  59. .build()
  60. }
  61. #[cfg(test)]
  62. mod tests {
  63. use super::*;
  64. #[derive(Debug)]
  65. struct Position {
  66. x: f32,
  67. y: f32,
  68. }
  69. #[test]
  70. fn test_log() {
  71. init_log("flowy", ".", "Debug").unwrap();
  72. tracing::info!("😁 Tracing info log");
  73. let pos = Position {
  74. x: 3.234,
  75. y: -1.223,
  76. };
  77. tracing::debug!(?pos.x, ?pos.y);
  78. log::debug!("😁 bridge 'log' to 'tracing'");
  79. }
  80. }