2个版本
0.2.1 | 2022年7月4日 |
---|---|
0.2.0 | 2022年7月4日 |
#448 在 调试
每月487次下载
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 })
}
⭐ 这些结构化字段目前仅限于以下类型的值:
u64
,i64
,f64
,bool
,char
或str
使用 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
推荐的编程模型是将日志记录器实例作为参数传递。这是一个好习惯,可以简单地传递上下文,但代价是它采用了与使用标准log
crate编写代码的其他人完全不同的编程模型,因此你可能需要重写更多代码,而不仅仅是你的程序初始化。
还有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
,如果你做任何形式的日志记录,你已经有了它:)
zdannar 2022
依赖项
~4–13MB
~149K SLoC