mirror of
https://github.com/Lumither/nocturne.git
synced 2026-10-17 10:26:21 +00:00
feat(macros) add panic_with_log
This commit is contained in:
7 files changed
+74
-64
No files matched your search
@@ -4,6 +4,7 @@ version = "0.1.0"
|
|||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
macros = { path = "../macros" }
|
||||||
constants = { path = "../constants" }
|
constants = { path = "../constants" }
|
||||||
chrono = { version = "0.4.38", features = ["serde", "alloc"] }
|
chrono = { version = "0.4.38", features = ["serde", "alloc"] }
|
||||||
tracing = "0.1.40"
|
tracing = "0.1.40"
|
||||||
|
|||||||
@@ -1,17 +1,10 @@
|
|||||||
use crate::logger;
|
use crate::logger;
|
||||||
use std::{
|
use std::{env, panic};
|
||||||
backtrace::{Backtrace, BacktraceStatus},
|
|
||||||
env, panic,
|
|
||||||
panic::PanicHookInfo,
|
|
||||||
};
|
|
||||||
use tracing::{error, event, span, Level};
|
|
||||||
|
|
||||||
use tracing_appender::non_blocking::WorkerGuard;
|
use tracing_appender::non_blocking::WorkerGuard;
|
||||||
|
|
||||||
pub fn logger_init() -> (WorkerGuard, WorkerGuard) {
|
pub fn logger_init() -> (WorkerGuard, WorkerGuard) {
|
||||||
let ret = logger::init();
|
logger::init()
|
||||||
panic::set_hook(Box::new(panic_hook));
|
|
||||||
ret
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn load_env() {
|
pub fn load_env() {
|
||||||
@@ -28,29 +21,3 @@ pub fn load_env() {
|
|||||||
println!("[info] no .env file referred, starting up")
|
println!("[info] no .env file referred, starting up")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn panic_hook(panic_info: &PanicHookInfo) {
|
|
||||||
let payload = panic_info.payload();
|
|
||||||
// panic_info.
|
|
||||||
|
|
||||||
let payload = if let Some(s) = payload.downcast_ref::<&str>() {
|
|
||||||
Some(&**s)
|
|
||||||
} else {
|
|
||||||
payload.downcast_ref::<String>().map(|s| s.as_str())
|
|
||||||
};
|
|
||||||
|
|
||||||
// let location = panic_info.location().map(|l| l.to_string());
|
|
||||||
// let backtrace = Backtrace::capture();
|
|
||||||
// let note = (backtrace.status() == BacktraceStatus::Disabled)
|
|
||||||
// .then_some("run with RUST_BACKTRACE=1 environment variable to display a backtrace");
|
|
||||||
// (Some(backtrace), note)
|
|
||||||
// };
|
|
||||||
//
|
|
||||||
// panic_info.
|
|
||||||
|
|
||||||
if let Some(location) = panic_info.location() {
|
|
||||||
eprintln!("err filename: {}", location.file())
|
|
||||||
}
|
|
||||||
|
|
||||||
event!(target: "test", Level::ERROR, "panic hook: {:?}", panic_info);
|
|
||||||
}
|
|
||||||
@@ -1,3 +1,6 @@
|
|||||||
|
use macros::panic_with_log;
|
||||||
|
use tracing::Level;
|
||||||
|
|
||||||
mod blog;
|
mod blog;
|
||||||
mod init;
|
mod init;
|
||||||
mod logger;
|
mod logger;
|
||||||
@@ -9,12 +12,10 @@ async fn main() {
|
|||||||
init::load_env();
|
init::load_env();
|
||||||
let _guards = init::logger_init();
|
let _guards = init::logger_init();
|
||||||
|
|
||||||
// panic!("test");
|
|
||||||
|
|
||||||
match server::start().await {
|
match server::start().await {
|
||||||
Ok(_) => {}
|
Ok(_) => {}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
panic!("server start failed: {}", e);
|
panic_with_log!(Level::ERROR, "failed to start server: {}", e);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -5,14 +5,13 @@ use std::process::exit;
|
|||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
|
|
||||||
use crate::blog;
|
use crate::blog;
|
||||||
use crate::scheduler::tasks::basic::BasicTask;
|
|
||||||
use crate::scheduler::Scheduler;
|
|
||||||
use axum::Router;
|
use axum::Router;
|
||||||
|
use macros::panic_with_log;
|
||||||
use sqlx::{
|
use sqlx::{
|
||||||
postgres::{PgConnectOptions, PgPoolOptions},
|
postgres::{PgConnectOptions, PgPoolOptions},
|
||||||
ConnectOptions,
|
ConnectOptions,
|
||||||
};
|
};
|
||||||
use tracing::{error, info, warn};
|
use tracing::{error, info, warn, Level};
|
||||||
|
|
||||||
pub async fn start() -> Result<(), Box<dyn Error>> {
|
pub async fn start() -> Result<(), Box<dyn Error>> {
|
||||||
let port: u32 = match env::var("BACKEND_PORT") {
|
let port: u32 = match env::var("BACKEND_PORT") {
|
||||||
@@ -39,8 +38,8 @@ pub async fn start() -> Result<(), Box<dyn Error>> {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// cron task
|
// cron task
|
||||||
let scheduler = Scheduler::new();
|
// let scheduler = Scheduler::new();
|
||||||
let test_str = "hello world".to_string();
|
// let test_str = "hello world".to_string();
|
||||||
// scheduler.insert(
|
// scheduler.insert(
|
||||||
// BasicTask::new(
|
// BasicTask::new(
|
||||||
// move || blog::cron::check_update::task(test_str.clone()),
|
// move || blog::cron::check_update::task(test_str.clone()),
|
||||||
@@ -51,15 +50,23 @@ pub async fn start() -> Result<(), Box<dyn Error>> {
|
|||||||
|
|
||||||
// http server
|
// http server
|
||||||
let app = Router::new()
|
let app = Router::new()
|
||||||
.nest("blog", blog::get_router())
|
.nest("/blog", blog::get_router())
|
||||||
.with_state(db_pool);
|
.with_state(db_pool);
|
||||||
|
|
||||||
let listener = tokio::net::TcpListener::bind(format!("0.0.0.0:{}", port))
|
let listener = match tokio::net::TcpListener::bind(format!("0.0.0.0:{}", port)).await {
|
||||||
.await
|
Ok(listener) => {
|
||||||
.unwrap_or_else(|e| {
|
info!("server started on 0.0.0.0:{}", port);
|
||||||
error!("failed to build TCP listener: {}", e.to_string());
|
listener
|
||||||
exit(1);
|
}
|
||||||
});
|
Err(e) => {
|
||||||
|
panic_with_log!(
|
||||||
|
Level::ERROR,
|
||||||
|
"failed to start server on 0.0.0.0:{}: {}",
|
||||||
|
port,
|
||||||
|
e.to_string()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
axum::serve(listener, app).await.unwrap_or_else(|e| {
|
axum::serve(listener, app).await.unwrap_or_else(|e| {
|
||||||
error!("failed to start axum: {}", e.to_string());
|
error!("failed to start axum: {}", e.to_string());
|
||||||
|
|||||||
@@ -4,3 +4,5 @@ version = "0.1.0"
|
|||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
tracing = "0.1.40"
|
||||||
|
tracing-subscriber = "0.3.18"
|
||||||
@@ -1,14 +1 @@
|
|||||||
pub fn add(left: u64, right: u64) -> u64 {
|
mod log;
|
||||||
left + right
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(test)]
|
|
||||||
mod tests {
|
|
||||||
use super::*;
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn it_works() {
|
|
||||||
let result = add(2, 2);
|
|
||||||
assert_eq!(result, 4);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
/// log the message at specific log level and exit(1)
|
||||||
|
///
|
||||||
|
/// # Example
|
||||||
|
/// ```rust
|
||||||
|
///
|
||||||
|
/// use macros::panic_with_log;
|
||||||
|
/// use tracing::Level;
|
||||||
|
///
|
||||||
|
/// panic_with_log!(Level::ERROR, "Test panicked: {}", 42);
|
||||||
|
/// ```
|
||||||
|
#[macro_export]
|
||||||
|
macro_rules! panic_with_log {
|
||||||
|
($level:expr, $msg:literal $(, $($arg:tt)*)?) => {{
|
||||||
|
use std::process;
|
||||||
|
use tracing::event;
|
||||||
|
event!($level, $msg $(, $($arg)*)?);
|
||||||
|
process::exit(1);
|
||||||
|
}};
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
#[test]
|
||||||
|
fn test_panic_with_log() {
|
||||||
|
use std::io;
|
||||||
|
use tracing::Level;
|
||||||
|
use tracing_subscriber::prelude::*;
|
||||||
|
use tracing_subscriber::{fmt, Registry};
|
||||||
|
|
||||||
|
let format = tracing_subscriber::fmt::format()
|
||||||
|
.with_level(true)
|
||||||
|
.with_target(true)
|
||||||
|
.with_source_location(true);
|
||||||
|
|
||||||
|
let subscriber = Registry::default().with(
|
||||||
|
fmt::Layer::default()
|
||||||
|
.with_writer(io::stderr)
|
||||||
|
.event_format(format),
|
||||||
|
);
|
||||||
|
|
||||||
|
tracing::subscriber::set_global_default(subscriber).unwrap();
|
||||||
|
|
||||||
|
panic_with_log!(Level::ERROR, "Test panicked: {}", 42);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in new issue
Block a user