lib.rs 2.9 KB

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