log_utils.rs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. // use std::fmt::Debug;
  2. use std::io;
  3. use tracing_appender_timezone::non_blocking::WorkerGuard;
  4. use tracing_subscriber::{fmt};
  5. use tracing_subscriber::layer::{SubscriberExt};
  6. // use tracing::field::{Field, Visit};
  7. use tracing_appender_timezone::rolling::{RollingFileAppender, Rotation};
  8. // struct ErrorMessageVisitor {
  9. // message: String
  10. // }
  11. //
  12. // impl Visit for ErrorMessageVisitor {
  13. // fn record_debug(&mut self, field: &Field, value: &dyn Debug) {
  14. // if field.name() == "message" {
  15. // self.message = format!("{:?}", value);
  16. // }
  17. // }
  18. // }
  19. // 错误报告发送到指定服务器
  20. // struct ReportingLayer {
  21. // account_name: String,
  22. // }
  23. // impl<S> Layer<S> for ReportingLayer
  24. // where
  25. // S: Subscriber + for<'a> tracing_subscriber::registry::LookupSpan<'a>,
  26. // {
  27. // fn on_event(&self, event: &Event<'_>, _ctx: Context<'_, S>) {
  28. // if event.metadata().level() == &tracing::Level::ERROR {
  29. // let mut visitor = ErrorMessageVisitor {
  30. // message: String::new()
  31. // };
  32. // event.record(&mut visitor);
  33. //
  34. // // let msg = format!("account={}, type=error, msg={}", self.account_name.clone(), visitor.message);
  35. // // info!(msg)
  36. // // send_remote_err_log(msg)
  37. // }
  38. // }
  39. // }
  40. pub fn init_log_with_debug() {
  41. let _ = final_init(tracing::Level::DEBUG.as_str(), 0);
  42. }
  43. pub fn init_log_with_trace() {
  44. let _ = final_init(tracing::Level::TRACE.as_str(), 0);
  45. }
  46. pub fn init_log_with_info() {
  47. let _ = final_init(tracing::Level::INFO.as_str(), 0);
  48. }
  49. pub fn final_init(level: &str, port: u32) -> WorkerGuard {
  50. let mut path = String::new();
  51. path.push_str("./logs");
  52. path.push_str(port.to_string().as_str());
  53. let file_appender = RollingFileAppender::builder()
  54. .time_zone(8)
  55. .rotation(Rotation::DAILY)
  56. .filename_suffix("log")
  57. .build(path)
  58. .expect("initializing rolling file appender failed");
  59. let (non_blocking, guard) = tracing_appender_timezone::non_blocking(file_appender);
  60. use time::{macros::format_description, UtcOffset};
  61. use tracing_subscriber::{fmt::time::OffsetTime};
  62. let local_time = OffsetTime::new(
  63. UtcOffset::from_hms(8, 0, 0).unwrap(),
  64. format_description!("[month]-[day] [hour]:[minute]:[second].[subsecond digits:3]"),
  65. );
  66. let fmt_layer = fmt::layer()
  67. .with_timer(local_time.clone())
  68. .with_target(true)
  69. .with_line_number(true)
  70. .with_level(true)
  71. .with_writer(io::stdout)
  72. .with_span_events(fmt::format::FmtSpan::FULL);
  73. let file_layer = fmt::layer()
  74. .with_timer(local_time.clone())
  75. .with_target(true)
  76. .with_ansi(false)
  77. .with_level(true)
  78. .with_writer(non_blocking.clone())
  79. .with_span_events(fmt::format::FmtSpan::FULL);
  80. // let reporting_layer = ReportingLayer {
  81. // account_name
  82. // };
  83. let layer = tracing_subscriber::Registry::default()
  84. .with(fmt_layer)
  85. .with(file_layer)
  86. // .with(reporting_layer)
  87. .with(tracing_subscriber::EnvFilter::new(level));
  88. tracing::subscriber::set_global_default(layer).unwrap();
  89. return guard;
  90. }