#json-log #json #log #logging

json_env_logger2

Rust的JSON结构化日志记录器,由softprops发起的原项目已被放弃

2个版本

0.2.1 2022年7月4日
0.2.0 2022年7月4日

#448调试

Download history 85/week @ 2024-03-13 207/week @ 2024-03-20 103/week @ 2024-03-27 163/week @ 2024-04-03 158/week @ 2024-04-10 183/week @ 2024-04-17 175/week @ 2024-04-24 186/week @ 2024-05-01 160/week @ 2024-05-08 185/week @ 2024-05-15 167/week @ 2024-05-22 167/week @ 2024-05-29 185/week @ 2024-06-05 130/week @ 2024-06-12 72/week @ 2024-06-19 66/week @ 2024-06-26

每月487次下载

MIT 许可证

17KB
151

json环境记录器

Rust的一个简单JSON结构化日志记录器。 这个crate是原始json_env_logger的重命名和重新发布。作者已放弃它。


安装

将以下内容添加到您的 Cargo.toml 文件中

[dependencies]
json_env_logger2 = "0.2"

使用方法

tl;dr

当您运行

$ RUST_LOG=trace cargo -q run \
  --example default \
  --features iso-timestamps

您将得到

{"level":"TRACE","ts":"2020-07-06T03:41:57.831Z","msg":"I am a trace","task_id":567,"thread_id":"12"}
{"level":"DEBUG","ts":"2020-07-06T03:41:57.832Z","msg":"I am a debug","foo":1}
{"level":"INFO","ts":"2020-07-06T03:41:57.832Z","msg":"I am an info"}
{"level":"WARN","ts":"2020-07-06T03:41:57.832Z","msg":"I am a warning"}
{"level":"ERROR","ts":"2020-07-06T03:41:57.832Z","msg":"I am an error"}

基本使用

类似于 env_logger,在启动日志记录引擎之前调用 init

fn main() {
    json_env_logger::init();

    log::info!("👋")
}

使用 RUST_LOG=info your/bin 运行您的程序

添加更多结构

《log》crate正在努力为其宏中的结构化字段添加一等接口。而不是重新发明这个功能,这个crate采用了它。《json_env_logger》将在存在时序列化这些键值对。遗憾的是,《log》crate尚未公开这些宏接口。 ...但是《kv-log-macro》做到了!

[dependencies]
json_env_logger = "0.1"
kv-log-macro = "1.0"
// the macros exported in this crate are
// log compatible and will one day be merged 
// so save your future self the toil of find and replace
use kv_log_macro as log;

fn main() {
    json_env_logger::init();

    log::info!("👋", { size: "medium", age: 42 })
}

⭐ 这些结构化字段目前仅限于以下类型的值:u64i64f64boolcharstr

使用 RUST_LOG=info your/bin 运行您的程序

ISO时间戳

默认情况下,json_env_logger使用Unix纪元时间作为时间戳。您可能更喜欢ISO-8601时间戳。您可以通过启用iso-timestamps功能来替换实现。

[dependencies]
json_env_logger = { version = "0.1", features = ["iso-timestamps"] }
fn main() {
    json_env_logger::init();

    log::info!("👋")
}

使用 RUST_LOG=info your/bin 运行您的程序

恐慌可见性

当不可避免地发生恐慌时,您可以使用恐慌钩子将恐慌序列化为JSON,然后在记录时使用error!将其记录下来。

fn main() {
    json_env_logger::init();
    json_env_logger::panic_hook();

    panic!("whoooops!")
}

使用 RUST_LOG=info your/bin 运行您的程序

⭐ 您还可以通过启用backtrace cargo功能来序列化回溯

常见问题解答

为什么我需要结构化日志记录?

可能您不需要。 ...但是可能您需要!如果您在生产环境中运行应用程序,并且如果您发出JSON日志,那么您可能需要,因为如果您的日志聚合器为您做了有用的事情,那么它可能很有用。

  • 基于结构化字段的过滤器,是手工艺品正则表达式查询的替代方案
  • 聚合统计
  • 警报自动化
  • 异常检测
  • 基本上,当计算机的日志以机器可读的格式结构化时,它可以为您做的任何事情

 
json_env_logger针对哪种用例?

大多数在Rust日志市场的人开始时都使用log。他们很快发现他们需要可配置的日志,所以他们转向env_logger。有时他们想要env_logger,但希望日志格式更美观,以便在主机本地应用程序中使用,所以他们转向pretty_env_logger,或者如果你喜欢emoji-logger

在其他情况下,你希望在云服务中运行应用程序,该服务奖励你以JSON格式生成日志。这就是这个用例的目标,那些来自env_logger但希望利用云服务提供的免费内置JSON日志解析和发现选项的人。

 
这些中已经存在吗?

实际上有几个。像Rust生态系统中的许多crate一样,它们都是好的。选择依赖关系是根据应用程序的目标和需求来选择权衡的一种舞蹈。

这里有slog,Rust的整个日志生态系统。它的优势在于它高度可配置。它的缺点在于它高度可配置的接口可能会妨碍你只是想以json格式输出结构化日志而不需要太多仪式的简单情况。

以下是从其文档中的一个直接示例

#[macro_use]
extern crate slog;
extern crate slog_json;

use slog::Drain;
use std::sync::Mutex;

fn main() {
    let root = slog::Logger::root(
        Mutex::new(slog_json::Json::default(std::io::stderr())).map(slog::Fuse),
        o!("version" => env!("CARGO_PKG_VERSION"))
    );
}

fn main() {
    json_env_logger::init();
}

slog推荐的编程模型是将日志记录器实例作为参数传递。这是一个好习惯,可以简单地传递上下文,但代价是它采用了与使用标准logcrate编写代码的其他人完全不同的编程模型,因此你可能需要重写更多代码,而不仅仅是你的程序初始化。

还有femme,它是一部分美化打印器,一部分JSON日志记录器,一部分WASM JavaScript对象记录器。它的优势在于它确实很美!它不仅仅是美化记录器,而且也不仅仅是JSON记录器。它是一系列东西的组合,使其关注面更广,而不是仅仅关注JSON日志格式。如果你只使用其中之一,你可能会携带你不需要的东西。

如果你正在从env_logger的环境变量驱动配置选项迁移,那么你可能会有些不幸。你将发现自己需要重新编译和重建你的应用程序来更改日志级别。

 
那么json_env_logger的权衡是什么呢?

很高兴你问了。它取决于env_logger,它有一些有偏见的默认设置,你可能不喜欢。例如,它默认将日志记录到stderr。你可能希望使用stdout。好消息是json_env_logger公开了其接口以覆盖这些观点。

env_logger中可用的某些功能在json_env_logger中未使用,这引入了额外的传递依赖项。我们知道这一点。幸运的是,它们都在env_logger功能标志之后,并且json_env_logger将它们全部关闭!唯一的传递依赖项只是log,如果你做任何形式的日志记录,你已经有了它:)

 
我还有更多问题

从技术上讲,这并不是一个问题,但没关系。可以通过打开GitHub问题来提问。谢谢!

 

zdannar 2022

依赖项

~4–13MB
~149K SLoC