lib.rs 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. mod layer;
  2. use crate::layer::*;
  3. use lazy_static::lazy_static;
  4. use log::LevelFilter;
  5. use std::sync::RwLock;
  6. use tracing::subscriber::set_global_default;
  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_ansi(true)
  39. .with_target(false)
  40. .with_max_level(tracing::Level::TRACE)
  41. .with_writer(std::io::stderr)
  42. .with_thread_ids(true)
  43. .json()
  44. // .with_current_span(true)
  45. // .with_span_list(true)
  46. .compact()
  47. .finish()
  48. .with(env_filter)
  49. .with(JsonStorageLayer)
  50. .with(FlowyFormattingLayer::new(std::io::stdout))
  51. .with(FlowyFormattingLayer::new(non_blocking));
  52. set_global_default(subscriber).map_err(|e| format!("{:?}", e))?;
  53. LogTracer::builder()
  54. .with_max_level(LevelFilter::Trace)
  55. .init()
  56. .map_err(|e| format!("{:?}", e))?;
  57. *LOG_GUARD.write().unwrap() = Some(guard);
  58. Ok(())
  59. }
  60. }
  61. #[cfg(test)]
  62. mod tests {
  63. use super::*;
  64. // run cargo test --features="use_bunyan" or cargo test
  65. #[test]
  66. fn test_log() {
  67. Builder::new("flowy", ".")
  68. .env_filter("debug")
  69. .build()
  70. .unwrap();
  71. tracing::info!("😁 tracing::info call");
  72. log::debug!("😁 log::debug call");
  73. say("hello world");
  74. }
  75. #[tracing::instrument(level = "trace", name = "say")]
  76. fn say(s: &str) {
  77. tracing::info!("{}", s);
  78. }
  79. }