Rust日志库如何支持JSON格式输出

在Rust项目中,我想使用日志库输出JSON格式的日志,方便后续用ELK等工具分析。目前已知有log、env_logger等基础库,但不确定它们是否原生支持JSON格式?是否需要通过类似serde的序列化库来实现?有没有推荐的支持JSON输出的成熟日志库方案?最好能给出具体配置示例。

2 回复

使用log4rsenv_logger配合serde_json。配置log4rs的encoder为json,或自定义env_logger的formatter,将日志字段序列化为JSON字符串即可。


Rust 日志库可以通过配置或使用特定库来实现 JSON 格式输出。以下是两种常用方法:

方法一:使用 env_logger + json 特性

Cargo.toml 中添加依赖:

[dependencies]
log = "0.4"
env_logger = { version = "0.10", features = ["json"] }

代码示例:

use log::{info, error, warn};

fn main() {
    // 初始化 JSON 格式的日志
    env_logger::init_from_env(
        env_logger::Env::default().default_filter_or("info")
    );
    
    info!(target: "app", "用户登录成功"; "user_id" => 123, "ip" => "192.168.1.1");
    warn!("磁盘空间不足"; "available" => "10GB");
    error!("数据库连接失败");
}

输出示例:

{"timestamp":"2023-10-01T12:00:00Z","level":"INFO","target":"app","message":"用户登录成功","user_id":123,"ip":"192.168.1.1"}

方法二:使用 slog 库(更强大的结构化日志)

Cargo.toml 中添加:

[dependencies]
slog = "2.7"
slog-json = "2.3"
slog-async = "2.5"

代码示例:

use slog::{info, o, Drain, Logger};
use slog_json::Json;
use std::sync::Mutex;

fn main() {
    let drain = Json::new(std::io::stdout())
        .add_default_keys()
        .build()
        .fuse();
    let drain = Mutex::new(drain).fuse();
    
    let log = Logger::root(drain, o!("version" => "1.0"));
    
    info!(log, "用户操作";
        "action" => "login",
        "user_id" => 123,
        "success" => true
    );
}

关键要点:

  • env_logger 简单易用,适合基础需求
  • slog 提供更丰富的结构化日志功能
  • JSON 格式便于日志收集和分析工具处理
  • 可通过环境变量 RUST_LOG 控制日志级别

选择哪种方案取决于项目的复杂度和对结构化日志的需求程度。

回到顶部