LogTape,一个用于 JavaScript 和 TypeScript 的零依赖结构化日志库,已发布 v0.6.0。发生了什么变化?
LogTape 的功能之一是通过分层类别继承接收器。例如,如果您设置两个记录器,如下所示:
import { configure, getConsoleSink, getFileSink } from "@logtape/logtape"; await configure({ sinks: { console: getConsoleSink(), file: getFileSink("app.log"), }, loggers: [ { category: ["app"], level: "debug", sinks: ["file"] }, { category: ["app", "module"], level: "debug", sinks: ["console"] }, ], });
写入 ["app"] 记录器的日志将仅保存到 app.log 文件,但写入 ["app", "module"] 记录器的日志将同时保存到 app.log 文件
app.log 文件并输出到控制台。这是因为 ["app", "module"] 记录器从其父类别 ["app"] 继承了接收器。
但是,有时您可能不希望出现这种行为。从 LogTape 0.6.0 开始,您现在可以
覆盖
await configure({ sinks: { /* omitted; same as above */ }, loggers: [ { category: ["app"], level: "debug", sinks: ["file"] }, { category: ["app", "module"], level: "debug", sinks: ["console"], parentSinks: "override" }, ], });
等待配置({ 汇:{ /* 省略;与上面相同*/ }, 记录器:[ { 类别:[“应用程序”],级别:“调试”,接收器:[“文件”] }, { 类别:[“应用程序”,“模块”],级别:“调试”,接收器:[“控制台”],parentSinks:“覆盖”}, ], }); 写入["app"]记录器的日志只会保存到
app.log文件,写入["app","module"]记录器的日志只会输出到控制台。这是因为子记录器 ["app", "module"] 覆盖了 ["app"] 记录器的接收器。
当然,默认值是parentSinks: "inherit",所以如果你不指定该选项,它的行为会和以前一样。
允许消息模板中的占位符使用前导/尾随空格
await configure({ sinks: { /* omitted; same as above */ }, loggers: [ { category: ["app"], level: "debug", sinks: ["file"] }, { category: ["app", "module"], level: "debug", sinks: ["console"], parentSinks: "override" }, ], });
logger.info("你好,{ name }!", { name: "Alice" });
await configure({ sinks: { /* omitted; same as above */ }, loggers: [ { category: ["app"], level: "debug", sinks: ["file"] }, { category: ["app", "module"], level: "debug", sinks: ["console"], parentSinks: "override" }, ], });
logger.info("你好,{name}!", { name: "Alice" });
await configure({ sinks: { /* omitted; same as above */ }, loggers: [ { category: ["app"], level: "debug", sinks: ["file"] }, { category: ["app", "module"], level: "debug", sinks: ["console"], parentSinks: "override" }, ], });
logger.info("你好,{ name }!", { " name ": "Alice" });
虽然这并不是严格意义上的错误,但根据编码习惯,它是容易出错的行为。
await configure({ sinks: { /* omitted; same as above */ }, loggers: [ { category: ["app"], level: "debug", sinks: ["file"] }, { category: ["app", "module"], level: "debug", sinks: ["console"], parentSinks: "override" }, ], });
logger.info("你好,{ name }!", { name: "Alice" });
正如预期的那样,日志是Hello, Alice!将被创建。
await configure({ sinks: { /* omitted; same as above */ }, loggers: [ { category: ["app"], level: "debug", sinks: ["file"] }, { category: ["app", "module"], level: "debug", sinks: ["console"], parentSinks: "override" }, ], });
logger.info("你好,{ name }!", { name: "Alice", " name ": "Bob" });
你好,鲍勃!将被记录而不是你好,爱丽丝!。
LogRecord.rawMessage 属性
LogRecord 是一种数据类型,表示在 LogTape 输出和格式化之前的日志。
虽然 LogRecord.message 属性已经存在,但该属性包含消息模板中的占位符替换为实际属性值后的结果。这在大多数情况下已经足够了,但是当日志输出目的地(接收器)是另一个日志系统时,您可能希望分别输出原始消息模板和属性值,从而允许接收日志系统用属性替换消息模板中的占位符直接值。
await configure({ sinks: { /* omitted; same as above */ }, loggers: [ { category: ["app"], level: "debug", sinks: ["file"] }, { category: ["app", "module"], level: "debug", sinks: ["console"], parentSinks: "override" }, ], });
logger.info("你好,{name}!", { name: "Alice" });
虽然 LogRecord.message 将包含值 ["Hello, ", "Alice", "!"],但 LogRecord.rawMessage 将包含值 "Hello, {name}!"。
可定制的内置文本格式化程序
await configure({ sinks: { /* omitted; same as above */ }, loggers: [ { category: ["app"], level: "debug", sinks: ["file"] }, { category: ["app", "module"], level: "debug", sinks: ["console"], parentSinks: "override" }, ], });
导出类型TextFormatter = (记录: LogRecord) => string;
但是,每次直接定义文本格式化程序可能会很麻烦,因此 LogTape 内置了 defaultTextFormatter 和 ansiColorFormatter 可供您使用。到目前为止,由于无法进行其他配置,因此您必须按原样接受预定格式。例如,如果您不喜欢像“警告”这样的日志级别输出为像 WRN 这样的三个字母缩写,则必须从头开始实现 TextFormatter。
但是,从 LogTape 0.6.0 开始,您可以通过 getDefaultTextFormatter() 和 getAnsiColorFormatter() 函数根据自己的喜好自定义各种格式设置,而无需从头开始实现 TextFormatter。
await configure({ sinks: { /* omitted; same as above */ }, loggers: [ { category: ["app"], level: "debug", sinks: ["file"] }, { category: ["app", "module"], level: "debug", sinks: ["console"], parentSinks: "override" }, ], });
const myFormatter = getDefaultTextFormatter({ level: "L" });
await configure({ sinks: { /* omitted; same as above */ }, loggers: [ { category: ["app"], level: "debug", sinks: ["file"] }, { category: ["app", "module"], level: "debug", sinks: ["console"], parentSinks: "override" }, ], });
const myFormatter = getDefaultTextFormatter({ 时间戳: "时间" });
更多格式化选项的说明,请参考相关文档。
从 JSR 和 npm 获取
await configure({ sinks: { /* omitted; same as above */ }, loggers: [ { category: ["app"], level: "debug", sinks: ["file"] }, { category: ["app", "module"], level: "debug", sinks: ["console"], parentSinks: "override" }, ], });
deno 添加 @logtape/[email protected] # Deno npm 添加@logtape/[email protected] # npm pnpm 添加@logtape/[email protected] # pnpm 纱线添加 @logtape/[email protected] # 纱线 包子添加@logtape/[email protected] # 包子
祝您登录愉快!
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3