文档
基础功能
日志

日志

logger 日志库,同时把日志输出到控制台与日志系统中,可以自定义控制台输出能力。

使用

使用 logger api

import { logger } from '@yunflyjs/yunfly';
 
logger.log('1111');
logger.info('hello %d', 'world!');
logger.error('some error!');
logger.access('access log');
💡

因为框架代理了 console 方法,因此以下使用方式同效。

console.log('1111');
console.info('hello %d', 'world!');
console.error('some error!');
console.access('access log');

链式调用

import { logger } from '@yunflyjs/yunfly';
 
// 颜色输出
logger.color('#2e8555').log('1111');
 
// 日志前缀
logger.prefix('yunfly').info('hello %d', 'world!');
 
// 控制台同步输出
logger.window().error('some error!');

日志储存类型

框架日志主要分为3种类型的日志:

    1. 记录常规业务需求日志的 business.log 日志
    1. 记录错误信息的 error.log 日志
    1. 记录框架请求链路的 access.log 日志

console 与日志储存关系

business.log

console.log
console.info
console.warn
console.trace
console.debug
 
// 等价于
logger.log
logger.info
logger.warn
logger.trace
logger.debug

以上打印日志都会存储到 business.log

💡

推荐使用 logger.info 进行日志的打印

error.log

console.error
 
// 等价于
logger.error

access.log

console.access
 
// 等价于
logger.access

方法说明

color

控制台输出日志时附带颜色(开发模式下有效)

import { logger } from '@yunflyjs/yunfly';
 
// 自定义输出颜色
logger.color('#2e8555').log('自定义输出颜色');
 
// 随机输出颜色
logger.color().log('随机输出颜色');

window

生产环境下日志默认输出到日志文件中,控制台不输出日志,可以通过 window 方法来定义控制台是否输出日志。

import { logger } from '@yunflyjs/yunfly';
 
logger.window().log('控制台中也输出日志');

prefix

输出日志附加前缀并给当前日志打标识

import { logger } from '@yunflyjs/yunfly';
 
logger.prefix('yunfly').log('这是输出的日志内容!');
// output: 【yunfly】: 这是输出的日志内容!
  • 备注:

prefix: 当前log名称, 可通过 process.env.YUNFLY_DEBUGprocess.env.YUNFLY_DEBUG_TYPE 进行控制输出, 跟 debug 库类似。

  • 案例二:通过 YUNFLY_DEBUG 环境变量控制日志输出
import { logger } from '@yunflyjs/yunfly';
 
process.env.YUNFLY_DEBUG = 'yunfly';
 
logger.prefix('yunfly').info('控制台输出当前日志!');
// output: 【yunfly】: 控制台输出当前日志!
 
logger.prefix('yundoc').info('控制台不会输出当前日志!');
// output: 

onlySign

当使用 prefix 给日志添加标识时,日志输出会附加标识前缀, 如果只想做日志标识而不想输出前缀,这时可通过 onlySign 进行控制。

import { logger } from '@yunflyjs/yunfly';
 
logger.prefix('yunfly').info('控制台输出有前缀的日志!');
// output: 【yunfly】: 控制台输出有前缀的日志!
 
logger.prefix('yunfly').onlySign().info('控制台不会输出有前缀的日志!');
// output: 控制台不会输出有前缀的日志!

logFilter

日志信息过滤函数。有两种方式实现日志过滤能力

    1. 通过 config.logFilter 过滤日志内容

例如过滤 password 值信息

src/config/config.default.ts
// 日志过滤配置
config.logFilter = (logType?: any, ...optionalParams: any[]) => // eslint-disable-line
    optionalParams.map((item: any) => {
        if (typeof item === 'string') {
            // 过滤密码等敏感字符
            return item.replace(/(password.*?"?:)(.*?)([,}])/g, (target, $1, $2, $3) => `${$1}"******"${$3}`);
        }
        return item;
    });
    1. 通过链式调用配置日志过滤器
import { logger } from '@yunflyjs/yunfly';
 
const logFilter = (logType?: any, ...optionalParams: any[]) =>
    optionalParams.map((item: any) => {
    if (typeof item === 'string') {
        // 过滤密码等敏感字符
        return item.replace(/(password.*?"?:)(.*?)([,}])/g, (target, $1, $2, $3) => `${$1}"******"${$3}`);
    }
    return item;
});
 
logger.logFilter(logFilter).info('password: 123456');
  • 通过 api 设置日志过滤器
import { logger } from '@yunflyjs/yunfly';
 
const logFilter = (logType?: any, ...optionalParams: any[]) =>
    optionalParams.map((item: any) => {
    if (typeof item === 'string') {
        // 过滤密码等敏感字符
        return item.replace(/(password.*?"?:)(.*?)([,}])/g, (target, $1, $2, $3) => `${$1}"******"${$3}`);
    }
    return item;
});
 
setLogFilter(logFilter);
 
logger.info('password: 123456');

argumentsHandle

日志打印之前对日志参数进行处理函数。

  • 通过链式调用配置处理器
import { logger } from '@yunflyjs/yunfly';
 
const handle = (...args: any[]): any[] => {
    return args.map((item)=>{
        return item + '加了一点东西!'
    })
}
 
logger.argumentsHandle(handle).info('自定义日志处理逻辑!');
  • 通过 setArgsHandle 配置处理器
import logger, { setArgsHandle } from '@yunflyjs/loggers';
 
const handle = (...args: any[]): any[] => {
    return args.map((item)=>{
        return item + '加了一点东西!'
    })
}
 
setArgsHandle(handle)
 
logger.info('自定义日志处理逻辑!');

其他知识

process.env.YUNFLY_DEBUG

当使用 debug 进行日志打印时, 可以通过环境变量来控制打印的输出

开发环境有效

使用场景: 开发模式下,控制台输出的日志太多,可以手动控制输出日志信息。

process.env.YUNFLY_DEBUG = 'logger1';
 
// output: 【logger1】: logger1
 
process.env.YUNFLY_DEBUG = 'logger1,logger3';
/*
 * output:
 * 【logger1】: logger1
 * 【logger3】: logger3
 */

process.env.YUNFLY_DEBUG_TYPE

当使用根据环境变量来控制日志输出时,我们可以决定是包含的还是输出,排查设置的才输出。

当前环境变量取值为:includeexclude

process.env.YUNFLY_DEBUG = 'logger1';
process.env.YUNFLY_DEBUG_TYPE = 'include';
// output: 【logger1】: logger1
 
process.env.YUNFLY_DEBUG = 'logger1';
process.env.YUNFLY_DEBUG_TYPE = 'exclude';
/*
 * output:
 * 【logger2】: logger2
 * 【logger3】: logger3
 */

通过配置控制日志输出内容

config.setEnv = {
  'YUNFLY_DEBUG': 'client-request',
  'YUNFLY_DEBUG_TYPE': 'exclude', // exclude | include
};

备注: 需要安装 @yunflyjs/yunfly-plugin-set-env 插件。

通过环境变量控制日志输出

// 在 beforeStart 生命周期中设置环境变量
process.env.YUNFLY_DEBUG_TYPE = 'exclude';
process.env.YUNFLY_DEBUG = 'client-request';
  • YUNFLY_DEBUG 可选日志参数说明
名称说明
client-requestclient 端(例如:浏览器)向 BFF发起的 HTTP 请求链路日志
http-requestBFF 发起的 HTTP 请求链路日志
grpc-requestBFF 发起的RPC 请求链路日志
grpc-restartRPC 请求过程中的 initrestart 日志
service-cryptoRPC 请求过程中的 initrestart 日志
  • YUNFLY_DEBUG_TYPE 参数说明

YUNFLY_DEBUG_TYPE 的值为 exclude 或者 include。 当值为 include 时,表示只输出 YUNFLY_DEBUG 定义的日志。