文章目录
- 介绍
- actix-web启用彩色日志
- crate地址&json格式日志
我们在进行rust的web开发时,如果不指定日志,就不会有输出,非常不友好
这里我们使用env_logger
进行日志打印
介绍
env_logger 需要配合 log 库使用,
env_logger
是 Rust 社区中一个非常流行的日志记录库。它提供了一个简单且易于使用的接口,用于配置和记录日志消息。env_logger
可以与 Rust 标准库中的 配合使用log crate
,log crate
是 Rust 中的一个日志抽象库,类似于 Java 中的 SLF4J(笔者感觉类似于这样的门面模式,因为我们只需要更换依赖即可修改log的具体实现,达到动态切换日志库的目的)。
log crate
提供了一个通用的日志接口,允许开发者在代码中记录日志消息。它定义了几个日志级别(如 Error
、Warn
、Info
、Debug
、Trace
),以及日志记录方法(如 error!
、warn!
、info!
、debug!
、trace!
)。log crate
的接口非常简单,允许开发者在代码中使用类似这样的宏log::info!
记录日志。
而 env_logger
则是一个基于 log crate
的实现,它提供了一个具体的日志记录器,并通过环境变量
来配置日志的输出级别和格式。你可以在代码中使用 log crate
的宏记录日志,然后通过使用 env_logger
来配置日志级别和格式,并将日志输出到控制台或文件中。
env_logger
还支持动态切换日志库。你可以在项目的依赖中同时包括 env_logger 和其他的日志库,然后通过设置环境变量来选择要使用的日志库。这样,你可以根据不同的需求和环境,灵活地切换日志库,而无需修改代码。
actix-web启用彩色日志
废话不多说,直接给各位爷上代码
toml
[dependencies]
log = "0.4.0"
env_logger = "0.9.0"
代码
use chrono::Local;
use std::io::Write;
use std::{env, io};
use std::sync::Mutex;
use std::time::Duration;
use log::info;
use actix_web::{App, HttpServer, middleware, web};
#[actix_rt::main]
async fn main() -> io::Result<()> {
// 初始化日志
init_logger();
let app = move || {
App::new()
// 设置中间件,让actix-web打印日志
.wrap(middleware::Logger::default())
};
HttpServer::new(app).bind("127.0.0.1:3000")?.run().await
}
fn init_logger() {
use env_logger::fmt::Color;
use env_logger::Env;
use log::LevelFilter;
let env = Env::default().filter_or("MY_LOG_LEVEL", "debug");
// 设置日志打印格式
env_logger::Builder::from_env(env)
.format(|buf, record| {
let level_color = match record.level() {
log::Level::Error => Color::Red,
log::Level::Warn => Color::Yellow,
log::Level::Info => Color::Green,
log::Level::Debug | log::Level::Trace => Color::Cyan,
};
let mut level_style = buf.style();
level_style.set_color(level_color).set_bold(true);
let mut style = buf.style();
style.set_color(Color::White).set_dimmed(true);
writeln!(
buf,
"{} {} [ {} ] {}",
Local::now().format("%Y-%m-%d %H:%M:%S"),
level_style.value(record.level()),
style.value(record.module_path().unwrap_or("<unnamed>")),
record.args()
)
})
.filter(None, LevelFilter::Debug)
.init();
info!("env_logger initialized.");
}
效果
crate地址&json格式日志
env_logger:https://crates.io/crates/env_logger
还有一些可以打印json格式的日志库,方便将日志发送往
ELK
中,比如【https://crates.io/crates/json_env_logger2】