actix-web使用tklog

toml

[package]
name = "tklog"
version = "0.1.0"
edition = "2021"

[dependencies]
tklog = "0.2.6"
tokio = "1.40"
log = "0.4"
actix-web = "4"
backtrace = "0.3"

rs

extern crate core;

use core::panic::PanicInfo;
use std::backtrace::Backtrace;
use std::env;
use std::fmt::Error;
use actix_web::{get, HttpResponse, web, App, HttpServer, middleware};
use std::sync::Arc;
use actix_web::dev::{Service, ServiceRequest, ServiceResponse, Transform};
use actix_web::error::ErrorInternalServerError;
use tokio::sync::Mutex;
use tklog::{async_debug, async_error, async_fatal, async_info, async_trace, async_warn, LEVEL, Format, ASYNC_LOG, MODE, async_infos};
use std::panic::{self, AssertUnwindSafe};
use rocket::futures;
use std::future::{ready};
use actix_web::{dev::{forward_ready}, http::header, HttpResponseBuilder};
use actix_web::body::{EitherBody};
use futures_util::future::LocalBoxFuture;
use futures_util::FutureExt;
use serde::{Deserialize, Serialize};
use actix_web::body::MessageBody;
use actix_web::middleware::{ErrorHandlerResponse, ErrorHandlers};
use actix_web::{
    dev,
    http::{StatusCode}, Result,
};
use actix_web::http::header::HeaderValue;
use serde_json;

#[derive(Serialize, Deserialize)]
pub struct JsonError {
    pub code: u16,
    pub message: String,
}

async fn async_log_init() {
    ASYNC_LOG
        .set_console(false) // 控制台输出
        .set_level(LEVEL::Info) // 日志等级
        .set_formatter("{time} {file} {level} | {message}\n") //打印格式
        .set_cutmode_by_time("api.log", MODE::DAY, 10, true) //根据日志轮转,每日,压缩
        .await;
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    // env::set_var("RUST_BACKTRACE", "1");
    // // 设置 panic 钩子,一般用于打印全局的panic日志
    // panic::set_hook(Box::new(|info| {
    //     let backtrace = Backtrace::capture();
    //     println!("Backtrace: {:?}", backtrace);
    //     println!("{}",info)
    // }));
    //初始化日志
    async_log_init().await;
    // 启动actix - web服务器
    HttpServer::new(move || {
        App::new()
            .wrap(ErrorHandlers::new().handler(StatusCode::INTERNAL_SERVER_ERROR, add_error_header)) // 使用自定义中间件
            .service(async_log_handler)
    })
        .bind("127.0.0.1:8889")?
        .run()
        .await
}

// 定义一个异步的处理函数,使用全局日志实例
#[get("/")]
async fn async_log_handler() -> HttpResponse {
    // 获取堆栈信息
    let backtrace = get_backtrace();
    // 使用日志实例记录信息,包括堆栈信息
    async_info!("async_infos>>>>", "CCCCCCCCCC", 1, 2, 3, "Backtrace: {}", backtrace);
    let i = 0;
    //let _ = 1 / i;
    //中间件
    if let Err(_e) = panic::catch_unwind(AssertUnwindSafe(|| {
        let _ = 1 / i;  // 这里会引发 panic
    })) {
        return HttpResponse::InternalServerError().body("除数不能为0");
    }
    HttpResponse::Ok().body("正常")
}

//堆栈
fn get_backtrace() -> String {
    let backtrace = Backtrace::capture();
    format!("{:?}", backtrace)
}

fn add_error_header<B>(res: dev::ServiceResponse<B>) -> Result<ErrorHandlerResponse<B>> {
    let status_code = res.status();
    let error = JsonError {
        code: status_code.as_u16(),
        message: format!("{}", status_code),
    };

    let json_response = HttpResponse::build(status_code)
        .content_type("application/json")
        .json(error);

    let (req, res) = res.into_parts();
    let new_res = ServiceResponse::new(req, json_response)
        .map_into_boxed_body()
        .map_into_right_body();

    Ok(ErrorHandlerResponse::Response(new_res))
}
posted @   朝阳1  阅读(33)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 我与微信审核的“相爱相杀”看个人小程序副业
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~
点击右上角即可分享
微信分享提示