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<()> {
async_log_init().await;
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;
if let Err(_e) = panic::catch_unwind(AssertUnwindSafe(|| {
let _ = 1 / i;
})) {
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))
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 我与微信审核的“相爱相杀”看个人小程序副业
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~