From 47938a306bf29a5b1c592c7d0510debe5878e713 Mon Sep 17 00:00:00 2001 From: Serenity Date: Thu, 23 May 2024 16:55:11 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BF=AE=E6=94=B9=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E4=B8=BAtracing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.toml | 10 +++++--- src/main.rs | 13 +--------- src/util/logs.rs | 67 ++++++++++++++++++++++++++++++++++++++---------- 3 files changed, 61 insertions(+), 29 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 2d79e36..7753fdf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "Nal" +name = "nal" version = "0.1.0" edition = "2021" @@ -14,11 +14,15 @@ serde_yaml = "0.9.32" #rc4 = "0.1.0" log = "0.4.20" async-trait = "0.1.77" -cron = "0.12.1" chrono = "0.4.34" +time = { version = "0.3.36", features = ["parsing", "macros"] } #env_logger = "0.11.3" #fern = "0.6" -log4rs = "1.3.0" +#log4rs = "1.3.0" +tracing = "0.1" +tracing-subscriber = { version = "0.3", features = ["time"] } +tracing-core = "0.1.32" +tracing-appender = "0.2" yaml-rust = "0.4.5" service-manager = "0.6.1" clap = { version = "4.5.4", features = ["derive"] } diff --git a/src/main.rs b/src/main.rs index baea9ef..5cf5938 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,8 +3,6 @@ use std::{env, fs}; use std::fs::{File, OpenOptions}; use std::str::FromStr; use tokio::time::{Duration, sleep}; -use chrono::{Datelike, DateTime, Local, Timelike, Utc}; -use cron::Schedule; use log::{debug, info, warn}; use serde_json::Value::Bool; use crate::core::nal; @@ -56,18 +54,9 @@ async fn main() { } } -async fn handler(){ +async fn handler() { let config = nal::init_config(); debug!("config: {config:#?}"); - - /*let expression = "* 1 * * * * *"; - let schedule = Schedule::from_str(expression).unwrap(); - println!("All stars: Upcoming fire times for '{}':", expression); - for datetime in schedule.upcoming(Utc).take(10) { - let is_ok = nal::check_net().await; - println!("net isOk: -> {is_ok:}"); - }*/ - loop { //检测网络是否正常 let is_ok = nal::check_net().await; diff --git a/src/util/logs.rs b/src/util/logs.rs index 394cce0..25157d3 100644 --- a/src/util/logs.rs +++ b/src/util/logs.rs @@ -1,17 +1,12 @@ use std::{env, fs}; +use std::fs::File; use std::io::{Error}; use std::path::Path; -use chrono::Local; -use log4rs::append::console::ConsoleAppender; -use log4rs::append::file::FileAppender; -use log4rs::{Config}; -use log4rs::config::{Appender, Logger, Root}; -use log4rs::encode::pattern::PatternEncoder; +use std::sync::Mutex; use log::{error, LevelFilter}; -use log4rs::append::rolling_file::policy::compound::CompoundPolicy; -use log4rs::append::rolling_file::policy::compound::roll::fixed_window::FixedWindowRoller; -use log4rs::append::rolling_file::policy::compound::trigger::size::SizeTrigger; -use log4rs::append::rolling_file::policy::compound::trigger::time::{TimeTrigger, TimeTriggerConfig, TimeTriggerInterval}; +use tracing::{info, Level}; +use tracing_subscriber::fmt::writer::MakeWriterExt; +use tracing_subscriber::util::SubscriberInitExt; /// 初始化日志 pub fn init(log_file: &str, level: LevelFilter) -> Result<(), Error> { @@ -23,9 +18,9 @@ pub fn init(log_file: &str, level: LevelFilter) -> Result<(), Error> { } else { ".".to_string() }; let logs_dir = current_dir + "/logs/"; fs::create_dir_all(logs_dir.clone()).unwrap(); // 如果需要,创建日志目录 - let log_file_path = logs_dir.clone().to_string() + log_file; + // let log_file_path = logs_dir.clone().to_string() + log_file; - init_log4rs(log_file_path, level); + init_tracing(logs_dir, log_file.to_string(), level); Ok(()) } @@ -64,6 +59,7 @@ fn init_env_logger() { fn init_fern() { /* //fern + use chrono::Local; fern::Dispatch::new() .format(|out, message, record| { out.finish(format_args!( @@ -86,15 +82,26 @@ fn init_fern() { /// 这是创建新文件的大小。32MB const TRIGGER_FILE_SIZE: u64 = 1024 * 1024 * 32; /// 日志存档将移动到的位置 有关模式信息,请参阅: -/// https://docs.rs/log4rs/*/log4rs/append/rolling_file/policy/compound/roll/fixed_window/struct.FixedWindowRollerBuilder.html#method.build +/// https://docs.rs/log4rs/latest/log4rs/append/rolling_file/policy/compound/roll/fixed_window/struct.FixedWindowRollerBuilder.html#method.build const ARCHIVE_PATTERN: &str = "./logs/nal.{}.log"; /// 要保留的存档日志文件数 const LOG_FILE_COUNT: u32 = 3; /// 初始化log4rs fn init_log4rs(log_file_path: String, level: LevelFilter) { + /* + use log4rs::append::console::ConsoleAppender; + use log4rs::append::file::FileAppender; + use log4rs::{Config}; + use log4rs::config::{Appender, Logger, Root}; + use log4rs::encode::pattern::PatternEncoder; + use log4rs::append::rolling_file::policy::compound::CompoundPolicy; + use log4rs::append::rolling_file::policy::compound::roll::fixed_window::FixedWindowRoller; + use log4rs::append::rolling_file::policy::compound::trigger::size::SizeTrigger; + use log4rs::append::rolling_file::policy::compound::trigger::time::{TimeTrigger, TimeTriggerConfig, TimeTriggerInterval}; + // log4rs - // Pattern: https://docs.rs/log4rs/*/log4rs/encode/pattern/index.html + // Pattern: https://docs.rs/log4rs/latest/log4rs/encode/pattern/index.html let pattern = Box::new(PatternEncoder::new("[{d(%Y-%m-%d %H:%M:%S)} {h({l}):<5.5} {M}] {f}:{L} {m}{n}")); // 创建用于文件日志记录的策略 @@ -135,4 +142,36 @@ fn init_log4rs(log_file_path: String, level: LevelFilter) { .unwrap() }; log4rs::init_config(config).unwrap(); + */ +} + +fn init_tracing(logs_dir: String, log_file: String, level: LevelFilter) { + let format = time::format_description::parse( + "[year]-[month padding:zero]-[day padding:zero] [hour]:[minute]:[second].[subsecond digits:3]", + ).unwrap(); + // time::format_description::well_known::Rfc3339; + + tracing_subscriber::fmt() + .with_file(true) + .with_level(true) + .with_target(true) + .with_line_number(true) + .with_thread_names(true) + .with_thread_ids(true) + .with_test_writer() + .with_max_level(Level::INFO) + .with_timer(tracing_subscriber::fmt::time::OffsetTime::new( + time::macros::offset!(+8), format, + )) + .with_ansi(false) + .with_writer( + Mutex::new(tracing_appender::rolling::daily(logs_dir.clone(), log_file.clone())).and( + //将 ERROR 及以上级别的日志输出到 stderr, 其他级别日志则输出到 stdout + std::io::stdout + .with_filter(|meta| meta.level() > &Level::ERROR) + .or_else(std::io::stderr) + ) + ) + .finish() + .init(); } \ No newline at end of file