log_utils.rs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. use std::fmt::Debug;
  2. use std::io;
  3. use tracing::{Event, info, Subscriber};
  4. use tracing_appender_timezone::non_blocking::WorkerGuard;
  5. use tracing_subscriber::{fmt, Layer};
  6. use tracing_subscriber::layer::{Context, SubscriberExt};
  7. use tracing::field::{Field, Visit};
  8. use tracing_appender_timezone::rolling::{RollingFileAppender, Rotation};
  9. struct ErrorMessageVisitor {
  10. message: String
  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. let msg = format!("account={}, type=error, msg={}", self.account_name.clone(), visitor.message);
  34. info!(msg)
  35. // send_remote_err_log(msg)
  36. }
  37. }
  38. }
  39. // pub fn send_remote_err_log(msg: String) {
  40. // tokio::spawn(async move {
  41. // let encoded_str = base64::encode(msg.clone());
  42. // let mut request_json_data = HashMap::new();
  43. // request_json_data.insert("serverName", "As");
  44. // request_json_data.insert("data", encoded_str.as_str());
  45. //
  46. // let res = Client::new().post("https://hhh.liangjiang.cc/api/log/addError?key=d64a8sc874sa8c4as5")
  47. // .json(&request_json_data)
  48. // .send()
  49. // .await;
  50. //
  51. // match res {
  52. // Ok(_resp) => {
  53. // // let body = _resp.text().await.unwrap();
  54. // }
  55. // Err(err) => {
  56. // warn!("log的error监听器发送远端报错失败:{:?}", err);
  57. // }
  58. // }
  59. // });
  60. // }
  61. pub fn init_log_with_debug() {
  62. let _ = final_init(tracing::Level::DEBUG.as_str(), 0, "test".to_string());
  63. }
  64. pub fn init_log_with_trace() {
  65. let _ = final_init(tracing::Level::TRACE.as_str(), 0, "test".to_string());
  66. }
  67. pub fn init_log_with_info() {
  68. let _ = final_init(tracing::Level::INFO.as_str(), 0, "test".to_string());
  69. }
  70. pub fn final_init(level: &str, port: u32, account_name: String) -> WorkerGuard {
  71. let mut path = String::new();
  72. path.push_str("./logs");
  73. path.push_str(port.to_string().as_str());
  74. let file_appender = RollingFileAppender::builder()
  75. .time_zone(8)
  76. .rotation(Rotation::DAILY)
  77. .filename_suffix("log")
  78. .build(path)
  79. .expect("initializing rolling file appender failed");
  80. let (non_blocking, guard) = tracing_appender_timezone::non_blocking(file_appender);
  81. use time::{macros::format_description, UtcOffset};
  82. use tracing_subscriber::{fmt::time::OffsetTime};
  83. let local_time = OffsetTime::new(
  84. UtcOffset::from_hms(8, 0, 0).unwrap(),
  85. format_description!("[month]-[day] [hour]:[minute]:[second].[subsecond digits:3]"),
  86. );
  87. let fmt_layer = fmt::layer()
  88. .with_timer(local_time.clone())
  89. .with_target(true)
  90. .with_line_number(true)
  91. .with_level(true)
  92. .with_writer(io::stdout)
  93. .with_span_events(fmt::format::FmtSpan::FULL);
  94. let file_layer = fmt::layer()
  95. .with_timer(local_time.clone())
  96. .with_target(true)
  97. .with_ansi(false)
  98. .with_level(true)
  99. .with_writer(non_blocking.clone())
  100. .with_span_events(fmt::format::FmtSpan::FULL);
  101. let reporting_layer = ReportingLayer {
  102. account_name
  103. };
  104. let layer = tracing_subscriber::Registry::default()
  105. .with(fmt_layer)
  106. .with(file_layer)
  107. .with(reporting_layer)
  108. .with(tracing_subscriber::EnvFilter::new(level));
  109. tracing::subscriber::set_global_default(layer).unwrap();
  110. return guard;
  111. }