lib.rs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. mod layer;
  2. use log::LevelFilter;
  3. use tracing::subscriber::set_global_default;
  4. use crate::layer::*;
  5. use lazy_static::lazy_static;
  6. use std::sync::RwLock;
  7. use tracing_appender::{non_blocking::WorkerGuard, rolling::RollingFileAppender};
  8. use tracing_bunyan_formatter::JsonStorageLayer;
  9. use tracing_log::LogTracer;
  10. use tracing_subscriber::{layer::SubscriberExt, EnvFilter};
  11. lazy_static! {
  12. static ref LOG_GUARD: RwLock<Option<WorkerGuard>> = RwLock::new(None);
  13. }
  14. pub struct Builder {
  15. #[allow(dead_code)]
  16. name: String,
  17. env_filter: String,
  18. file_appender: RollingFileAppender,
  19. }
  20. impl Builder {
  21. pub fn new(name: &str, directory: &str) -> Self {
  22. // let directory = directory.as_ref().to_str().unwrap().to_owned();
  23. let local_file_name = format!("{}.log", name);
  24. Builder {
  25. name: name.to_owned(),
  26. env_filter: "Info".to_owned(),
  27. file_appender: tracing_appender::rolling::daily(directory, local_file_name),
  28. }
  29. }
  30. pub fn env_filter(mut self, env_filter: &str) -> Self {
  31. self.env_filter = env_filter.to_owned();
  32. self
  33. }
  34. pub fn build(self) -> std::result::Result<(), String> {
  35. let env_filter = EnvFilter::new(self.env_filter);
  36. let (non_blocking, guard) = tracing_appender::non_blocking(self.file_appender);
  37. let subscriber = tracing_subscriber::fmt()
  38. // .with_span_events(FmtSpan::NEW | FmtSpan::CLOSE)
  39. .with_ansi(false)
  40. .with_target(false)
  41. .with_max_level(tracing::Level::TRACE)
  42. .with_writer(std::io::stderr)
  43. .with_thread_ids(true)
  44. // .with_writer(non_blocking)
  45. .json()
  46. .with_current_span(true)
  47. .with_span_list(true)
  48. .compact()
  49. .finish()
  50. .with(env_filter)
  51. .with(JsonStorageLayer)
  52. .with(FlowyFormattingLayer::new(std::io::stdout))
  53. .with(FlowyFormattingLayer::new(non_blocking));
  54. // if cfg!(feature = "use_bunyan") {
  55. // let formatting_layer = BunyanFormattingLayer::new(self.name.clone(),
  56. // std::io::stdout); let _ =
  57. // set_global_default(subscriber.with(JsonStorageLayer).with(formatting_layer)).
  58. // map_err(|e| format!("{:?}", e))?; } else {
  59. // let _ = set_global_default(subscriber).map_err(|e| format!("{:?}", e))?;
  60. // }
  61. let _ = set_global_default(subscriber).map_err(|e| format!("{:?}", e))?;
  62. let _ = LogTracer::builder()
  63. .with_max_level(LevelFilter::Trace)
  64. .init()
  65. .map_err(|e| format!("{:?}", e))
  66. .unwrap();
  67. *LOG_GUARD.write().unwrap() = Some(guard);
  68. Ok(())
  69. }
  70. }
  71. #[cfg(test)]
  72. mod tests {
  73. use super::*;
  74. #[derive(Debug)]
  75. struct Position {
  76. x: f32,
  77. y: f32,
  78. }
  79. // run cargo test --features="use_bunyan" or cargo test
  80. #[test]
  81. fn test_log() {
  82. let _ = Builder::new("flowy", ".").env_filter("debug").build().unwrap();
  83. tracing::info!("😁 tracing::info call");
  84. log::debug!("😁 log::debug call");
  85. say("hello world");
  86. }
  87. #[tracing::instrument(name = "say")]
  88. fn say(s: &str) {
  89. tracing::info!("{}", s);
  90. }
  91. }