Selaa lähdekoodia

清仓程序日志和策略日志分离

注释错误日志报送https://hhh.liangjiang.cc/api/log/addError?key=d64a8sc874sa8c4as5 代码
JiahengHe 1 vuosi sitten
vanhempi
commit
ba8a60a336
5 muutettua tiedostoa jossa 159 lisäystä ja 12 poistoa
  1. 132 0
      global/src/clear_log_utils.rs
  2. 1 0
      global/src/lib.rs
  3. 1 1
      global/src/log_utils.rs
  4. 16 2
      src/main.rs
  5. 9 9
      strategy/src/clear_core.rs

+ 132 - 0
global/src/clear_log_utils.rs

@@ -0,0 +1,132 @@
+use std::collections::HashMap;
+use std::fmt::Debug;
+use std::io;
+use tracing::{Event, Subscriber, warn};
+use tracing_appender_timezone::non_blocking::WorkerGuard;
+use tracing_subscriber::{fmt, Layer};
+use tracing_subscriber::layer::{Context, SubscriberExt};
+use reqwest::{Client};
+use tracing::field::{Field, Visit};
+use tracing_appender_timezone::rolling::{RollingFileAppender, Rotation};
+
+
+struct ErrorMessageVisitor {
+    message: String
+}
+
+impl Visit for ErrorMessageVisitor {
+    fn record_debug(&mut self, field: &Field, value: &dyn Debug) {
+        if field.name() == "message" {
+            self.message = format!("{:?}", value);
+        }
+    }
+}
+
+
+// 错误报告发送到指定服务器
+struct ReportingLayer {
+    account_name: String,
+}
+impl<S> Layer<S> for ReportingLayer
+where
+    S: Subscriber + for<'a> tracing_subscriber::registry::LookupSpan<'a>,
+{
+    fn on_event(&self, event: &Event<'_>, _ctx: Context<'_, S>) {
+        if event.metadata().level() == &tracing::Level::ERROR {
+            let mut visitor = ErrorMessageVisitor {
+                message: String::new()
+            };
+            event.record(&mut visitor);
+
+            let msg = format!("account={}, type=error, msg={}", self.account_name.clone(), visitor.message);
+            // send_remote_err_log(msg)
+        }
+    }
+}
+
+pub fn send_remote_err_log(msg: String) {
+    tokio::spawn(async move {
+        let encoded_str = base64::encode(msg.clone());
+        let mut request_json_data = HashMap::new();
+        request_json_data.insert("serverName", "As");
+        request_json_data.insert("data", encoded_str.as_str());
+
+        let res = Client::new().post("https://hhh.liangjiang.cc/api/log/addError?key=d64a8sc874sa8c4as5")
+            .json(&request_json_data)
+            .send()
+            .await;
+
+        match res {
+            Ok(_resp) => {
+                // let body = _resp.text().await.unwrap();
+            }
+            Err(err) => {
+                warn!("log的error监听器发送远端报错失败:{:?}", err);
+            }
+        }
+    });
+}
+
+pub fn init_log_with_debug() {
+    let _ = final_init(tracing::Level::DEBUG.as_str(), 0, "test".to_string());
+}
+
+pub fn init_log_with_trace() {
+    let _ = final_init(tracing::Level::TRACE.as_str(), 0, "test".to_string());
+}
+
+pub fn init_log_with_info() {
+    let _ = final_init(tracing::Level::INFO.as_str(), 0, "test".to_string());
+}
+
+pub fn final_init(level: &str, port: u32, account_name: String) -> WorkerGuard {
+    let mut path = String::new();
+    path.push_str("./logs");
+    path.push_str(port.to_string().as_str());
+    path.push_str("/clear_program");
+
+    let file_appender = RollingFileAppender::builder()
+        .time_zone(8)
+        .rotation(Rotation::DAILY)
+        .filename_suffix("log")
+        .build(path)
+        .expect("initializing rolling file appender failed");
+    let (non_blocking, guard) = tracing_appender_timezone::non_blocking(file_appender);
+
+    use time::{macros::format_description, UtcOffset};
+    use tracing_subscriber::{fmt::time::OffsetTime};
+    let local_time = OffsetTime::new(
+        UtcOffset::from_hms(8, 0, 0).unwrap(),
+        format_description!("[month]-[day] [hour]:[minute]:[second].[subsecond digits:3]"),
+    );
+
+    let fmt_layer = fmt::layer()
+        .with_timer(local_time.clone())
+        .with_target(true)
+        .with_line_number(true)
+        .with_level(true)
+        .with_writer(io::stdout)
+        .with_span_events(fmt::format::FmtSpan::FULL);
+
+    let file_layer = fmt::layer()
+        .with_timer(local_time.clone())
+        .with_target(true)
+        .with_ansi(false)
+        .with_level(true)
+        .with_writer(non_blocking.clone())
+        .with_span_events(fmt::format::FmtSpan::FULL);
+
+    let reporting_layer = ReportingLayer {
+        account_name
+    };
+
+    let layer = tracing_subscriber::Registry::default()
+        .with(fmt_layer)
+        .with(file_layer)
+        .with(reporting_layer)
+        .with(tracing_subscriber::EnvFilter::new(level));
+
+    tracing::subscriber::set_global_default(layer).unwrap();
+
+    return guard;
+}

+ 1 - 0
global/src/lib.rs

@@ -6,3 +6,4 @@ pub mod export_utils;
 pub mod account_info;
 pub mod cci;
 pub mod clear_position_result;
+pub mod clear_log_utils;

+ 1 - 1
global/src/log_utils.rs

@@ -39,7 +39,7 @@ impl<S> Layer<S> for ReportingLayer
             event.record(&mut visitor);
 
             let msg = format!("account={}, type=error, msg={}", self.account_name.clone(), visitor.message);
-            send_remote_err_log(msg)
+            // send_remote_err_log(msg)
         }
     }
 }

+ 16 - 2
src/main.rs

@@ -16,8 +16,16 @@ use global::params::Params;
 
 // 日志级别配置
 fn log_level_init(log_str: String, port: u32, account_name: String) -> WorkerGuard {
+    let log = global::log_utils::final_init(log_str.as_str(), port, account_name);
     info!("日志级别读取成功:{}。", log_str);
-    global::log_utils::final_init(log_str.as_str(), port, account_name)
+    return log;
+}
+
+// 清仓程序日志级别配置
+fn clear_log_level_init(log_str: String, port: u32, account_name: String) -> WorkerGuard {
+    let log = global::clear_log_utils::final_init(log_str.as_str(), port, account_name);
+    info!("清仓程序日志级别读取成功:{}。", log_str);
+    return log;
 }
 
 // 获取本地配置
@@ -114,7 +122,13 @@ async fn main() {
     let params = read_params_json();
 
     // 日志级别配置
-    let _guard = log_level_init(params.log_level.clone(), params.port.clone(), params.account_name.clone());
+    let _guard;
+    if params.run_mode == 1 {
+        _guard = clear_log_level_init(params.log_level.clone(), params.port.clone(), params.account_name.clone());
+    } else {
+        _guard = log_level_init(params.log_level.clone(), params.port.clone(), params.account_name.clone());
+    }
+
     info!("--------------------------------程序开始执行-----------------------------");
     info!("配置读取成功:{:?}。", params);
     // 主进程控制

+ 9 - 9
strategy/src/clear_core.rs

@@ -435,10 +435,12 @@ impl ClearCore {
             Ok(val) => {
                 let length = val.len();
                 result.clear_order_num = length.to_string();
-                info!("已清空所有挂单({}条)", length);
                 result.clear_order_str = format!("清空所有挂单:{:?}", val);
-                for o in val {
-                    info!("    {:?}", o);
+                if length > 0{
+                    info!("已清空所有挂单({}条)", length);
+                    for o in val {
+                        info!("    {:?}", o);
+                    }
                 }
             }
             Err(err) => {
@@ -448,7 +450,9 @@ impl ClearCore {
                         let length = val.len();
                         result.clear_order_num = length.to_string();
                         result.clear_order_str = format!("清空所有挂单(备用):{:?}", val);
-                        info!("清空所有挂单({}条):{:?}", length, val);
+                        if length > 0{
+                            info!("清空所有挂单({}条):{:?}", length, val);
+                        }
                     }
                     Err(exc) => {
                         result.clear_order_str = exc.to_string();
@@ -534,9 +538,6 @@ impl ClearCore {
 
     // #[instrument(skip(self), level="TRACE")]
     pub async fn exit(&mut self, r_id: String) -> bool {
-        info!("-------------------------启动退出流程({})----------------------------", self.exit_msg);
-        info!("");
-
         let mut result = self.check_position().await;
         // 设置机器人id
         result.r_id = r_id;
@@ -548,8 +549,7 @@ impl ClearCore {
             // 上报清仓日志
         }
 
-        info!("订单、仓位清除完毕,为避免api失效导致遗漏仓位,建议人工复查。");
-        info!("停机原因:{}。", self.exit_msg);
+        info!("订单、仓位自动清除完毕。");
         return true;
     }