lib.rs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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 Builder {
  8. name: String,
  9. env_filter: String,
  10. }
  11. impl Builder {
  12. pub fn new(name: &str) -> Self {
  13. Builder {
  14. name: name.to_owned(),
  15. env_filter: "Info".to_owned(),
  16. }
  17. }
  18. pub fn env_filter(mut self, env_filter: &str) -> Self {
  19. self.env_filter = env_filter.to_owned();
  20. self
  21. }
  22. pub fn local(self, directory: impl AsRef<Path>) -> Self {
  23. let directory = directory.as_ref().to_str().unwrap().to_owned();
  24. let local_file_name = format!("{}.log", &self.name);
  25. let file_appender = tracing_appender::rolling::daily(directory, local_file_name);
  26. let (_non_blocking, _guard) = tracing_appender::non_blocking(file_appender);
  27. self
  28. }
  29. pub fn build(self) -> std::result::Result<(), String> {
  30. let env_filter = EnvFilter::new(self.env_filter);
  31. let subscriber = tracing_subscriber::fmt()
  32. .with_target(false)
  33. .with_max_level(tracing::Level::TRACE)
  34. .with_writer(std::io::stderr)
  35. .with_thread_ids(false)
  36. .with_target(false)
  37. // .with_writer(non_blocking)
  38. .compact()
  39. .finish()
  40. .with(env_filter);
  41. if cfg!(feature = "use_bunyan") {
  42. let formatting_layer = BunyanFormattingLayer::new(self.name.clone(), std::io::stdout);
  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. #[cfg(test)]
  57. mod tests {
  58. use super::*;
  59. #[derive(Debug)]
  60. struct Position {
  61. x: f32,
  62. y: f32,
  63. }
  64. // run cargo test --features="use_bunyan" or cargo test
  65. #[test]
  66. fn test_log() {
  67. let _ = Builder::new("flowy").env_filter("debug").build();
  68. tracing::info!("😁 Tracing info log");
  69. let pos = Position {
  70. x: 3.234,
  71. y: -1.223,
  72. };
  73. tracing::debug!(?pos.x, ?pos.y);
  74. log::debug!("😁 bridge 'log' to 'tracing'");
  75. say("hello world");
  76. }
  77. #[tracing::instrument(name = "say")]
  78. fn say(s: &str) {
  79. log::info!("{}", s);
  80. }
  81. }