RavelloH's Blog

LOADing...



RLog:可能是NodeJs端最好的日志系统

rlog-maybe-the-best-logging-system-for-nodejs

文档/技术 6905

nodejsnpmjavascript


前言

RLog,实际上是我高中时期与我的一个同学一起开发的NodeJs端log库,我负责所有主要功能,他负责写类型注释。

当初做这个的初衷就是想让每次console.log变得更加优雅——不仅仅是为了调试,也是为了显示与记录。

从结果上来看,上手是非常简单的。你只需要把所有console.log替换为rlog.log,RLog就能帮你完成一切日志相关的操作。这包括但不限于:

  • 着色
  • 将输出写入至文件
  • 添加时间
  • 隐藏私密内容
  • 添加信息等级

从这些方面来看,RLog已经符合“优雅”的初衷了。本文会详细介绍RLog的进阶内容,助你的NodeJs编程一臂之力。

RavelloH/RLog: A module for optimizing log output in node.js, supporting colored output, embedded timestamp, log streaming writing, type coloring, keyword coloring, and so on.

效果

intro

上图是RLog中全部效果的展示,其功能主要有:

  • 着色:使用正则表达式,为输出内容中的特殊内容(IP/日期/网址/布尔值)等着色,并且你可以在配置文件中自定义相关规则及颜色。
  • 可自定义的时间输出格式:默认为YYYY-MM-DD HH:mm:ss.SSS,你可以自定义修改这个字符串,也可以使用预设(UTC/ISO/timestamp)
  • 提供事件钩子,如rlog.onExit(() => {})
  • 输出多行的信息时,RLog会自己换行并添加合适的缩进。mutiline
  • 智能的rlog.log()方法 —— 与console.log完全相同的输入方式,如rlog.log("Hello world!", "This is a message", 123, true);,不过rlog.log会自动添加时间并自动判断输出内容的等级,十分优雅。log
  • 可单独拆分的screen和file类——默认情况下在screen和file里都输出,你也可以通过类似rlog.file.info()的方法仅向其中一个输出。例如,你可以将详细的运行信息输出到文件,而保证屏幕输出的整洁可读。
  • 使用文件读写流的方式异步写入log到文件,性能优秀。
  • 提供了一个progress方法,方便的输出进度条。

安装

使用npm进行安装:

npm install rlog-js

使用示例

使用rlog-js非常简单,首先导入rlog-js:

const Rlog = require("rlog-js");

然后创建一个Rlog实例:

const rlog = new Rlog();

接下来就可以使用各种接口来输出日志了。

具体来说,./test.js中有大量对rlog的调用示例,以供查看。

一个最简单的使用示例如下:

const Rlog = require("rlog-js");

const rlog = new Rlog({
  enableColorfulOutput: true,
  logFilePath: "logs.txt",
});

rlog.config.setConfig({
  timeFormat: "YYYY-MM-DD HH:mm:ss",
  timezone: "Asia/Shanghai",
  blockedWordsList: ["password", "secret"],
});

rlog.info("This is an information log");
rlog.log("This is an automatically recognized type of log output");
rlog.warning("This is a warning log");
rlog.error("This is an error log");
rlog.success("This is a success log");
rlog.exit("This is a secure exit method");

接口

Rlog

rlog.methodName();

Rlog是rlog-js的主类,用于创建日志实例,会自动调用File和Screen方法。它具有以下方法:

  • info(message):打印一条信息日志,并将其写入日志文件。
  • warning(message):打印一条警告日志,并将其写入日志文件。
  • error(message):打印一条错误日志,并将其写入日志文件。
  • success(message):打印一条成功日志,并将其写入日志文件。
  • exit(message):打印一条退出日志,并将其写入日志文件,然后终止应用程序。
  • log(message): 自动识别message类型并调用相关函数。
  • progress(num,max): 打印进度条,num为当前进度,max为总进度

Config

rlog.config;

Config是一个用于配置rlog-js的类。可设置的项,详见#配置

  • enableColorfulOutput(boolean):是否启用彩色输出,默认为true。
  • logFilePath(string):日志文件的路径,默认为undefined,表示不将日志写入文件。
  • timeFormat(string):时间的格式,默认为"YYYY-MM-DD HH:mm:ss.SSS"。
  • timezone(string):时区,默认为"GMT"。
  • blockedWordsList(Array<string>):需要屏蔽的敏感词列表,默认为空数组。
  • customColorRules(Array<{reg: string, color: string}>):自定义的颜色规则列表,默认包含一些常用规则。
  • screenLength(number):屏幕输出的最大宽度,在载入RLog时自动获取。

Config类提供了以下方法:

  • setConfig(obj):根据传入的对象更新配置。
  • setConfigGlobal(obj):根据传入的对象更新配置,并将更新后的配置应用到全局。

Toolkit

rlog.toolkit.methodName();

Toolkit是一个工具类,用于提供一些常用的工具函数。它具有以下方法:

  • checkLogFile(path):检查日志文件是否存在,如果不存在则创建该文件。
  • colorizeString(str):根据配置的颜色规则对字符串进行着色。
  • formatTime():根据配置的时间格式和时区生成时间字符串。
  • encryptPrivacyContent(str):对字符串中的敏感内容进行加密。
  • colorizeType(variable):根据变量的类型对其进行着色。
  • padLines(str, width):对字符串中除第一行外的每一行进行缩进。

Screen

rlog.screen.methodName();

Screen是用于在控制台打印日志的类。调用此方法,将仅在屏幕中输出,不会写入至文件。它具有以下方法:

  • info(message, time):打印一条信息日志。
  • warning(message, time):打印一条警告日志。
  • error(message, time):打印一条错误日志。
  • success(message, time):打印一条成功日志。
  • exit(message, time):打印一条退出日志,并终止应用程序。

File

rlog.file.methodName();

File是用于将日志写入文件的类。调用此方法,若已设置日志文件路径,将会写入至文件,不会在屏幕输出。它具有以下方法:

  • init():初始化日志文件,如果配置了日志文件路径。不需要手动调用。
  • writeLogToStream(text):将日志写入文件流。
  • writeLog(text):将日志写入文件。
  • info(message, time):写入一条信息日志。
  • warning(message, time):写入一条警告日志。
  • error(message, time):写入一条错误日志。
  • success(message, time):写入一条成功日志。
  • exit(message, time):写入一条退出日志,并终止应用程序。

回调

rlog-js提供了一个回调onExit,用来在退出程序之前执行(如显示issue report提示等)

rlog.onExit(() => {
  console.log('rlog.exit() called and event triggered.');
});

进度条

rlog-js提供了一个进度条progress,可以在控制台中显示进度条。 一个可用的示例如下:

const Rlog = require("./index.js");
const rlog = new Rlog();

rlog.log('当一个progress单独出现时,不会影响上下文')
rlog.progress(168,1668)
rlog.log('当更多progress一块出现时,屏幕只显示最新的')

let i = 0
let a = setInterval(()=>{
    i +=1
    if (i == 234) {
        clearImmediate(a)
        process.exit()
    }
    rlog.progress(i,233)
},10)

progess

配置

rlog-js还提供了一些配置选项,可以在创建Rlog实例时进行配置,也可以使用setConfig()setConfigGlobal()或者以rlog.config[config] = <value>的方式设置。

以下是可用的配置选项及其默认值:

{
    enableColorfulOutput: true,
    // 是否启用彩色输出
    logFilePath: undefined,
    // 日志文件路径,如果不设置则不会输出到文件
    timeFormat: "YYYY-MM-DD HH:mm:ss.SSS",
    // 时间格式
    timezone: "GMT",
    // 时区
    blockedWordsList: [],
    // 需要屏蔽的词汇列表
    customColorRules: [// 自定义颜色规则
        {
            reg: "false",
            color: "red",
        },
        {
            reg: "true",
            color: "green",
        },
        {
            reg: "((2(5[0-5]|[0-4]\\d))|[0-1]?\\d{1,2})(\\.((2(5[0-5]|[0-4]\\d))|[0-1]?\\d{1,2})){3}",
            color: "cyan",
        },
        {
            reg: "[a-zA-z]+://[^\\s]*",
            color: "cyan",
        },
        {
            reg: "\\d{4}-\\d{1,2}-\\d{1,2}",
            color: "green",
        },
        {
            reg: "\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*",
            color: "cyan",
        },
        {
            reg: "[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}",
            color: "cyan",
        },
        {
            reg: "(w+)s*:s*([^;]+)",
            color: "cyan",
        },
    ]
}

可以通过传递一个配置对象来配置Rlog实例:

const config = {
  enableColorfulOutput: true,
  logFilePath: "/path/to/logfile.log",
  timeFormat: "YYYY-MM-DD HH:mm:ss.SSS",
  timezone: "GMT",
  blockedWordsList: ["password", "secret"],
  customColorRules: [
    {
      reg: "error",
      color: "red",
    },
    {
      reg: "warning",
      color: "yellow",
    },
    {
      reg: "success",
      color: "green",
    },
  ],
};

const rlog = new Rlog(config);

或者使用相关函数设置:

rlog.config.setConfig({
  timeFormat: "YYYY-MM-DD HH:mm:ss",
  timezone: "Asia/Shanghai",
  blockedWordsList: ["password", "secret"],
});

rlog.config.setConfigGlobal({
  timeFormat: "YYYY-MM-DD HH:mm:ss",
  timezone: "Asia/Shanghai",
  blockedWordsList: ["password", "secret"],
});
INFO

00:00


无正在播放的音乐
00:00/00:00

账号
User avatar
未登录未设置描述...