【问题标题】:Winston custom log levels typescript definitionsWinston 自定义日志级别打字稿定义
【发布时间】:2019-04-17 07:26:53
【问题描述】:

我正在开发一个节点应用程序并使用 Typescript。 我有温斯顿3。 在我的代码中,我添加了自定义日志级别;

const myCustomLevels = {
    levels: {
        data: 10,
        protocol: 9,
        debug: 8,
        info: 7,
        notice: 6,
        note: 5,
        warn: 4,
        error: 3,
        crit: 2,
        alert: 1,
        emerg: 0,
    }
}

然后

const logger = winston.createLogger({
    level: data,
    levels: myCustomLevels.levels,
    format: winston.format.combine(
        winston.format.json()
    ),
    transports: [new winston.transports.Console()],
});

我需要帮助的问题是当我使用记录器时 Typescript 抱怨。

logger.protocol({});

在这种情况下,类型是 const logger: winston.Logger,而 ts 是 [ts] Property 'protocol' does not exist on type 'Logger'. [2339]。 Typescript 不知道我的等级。

我该如何纠正这个问题,以便tsc 知道我在记录器上的级别?

【问题讨论】:

    标签: typescript winston


    【解决方案1】:

    不幸的是,当前编写的定义不允许自定义日志级别。最简单的解决方案是将返回的记录器转换为记录器和包含额外方法的类型的交集。我们可以使用映射类型 Recordkeyof 根据您的 const 声明创建此类型

    import * as winston from 'winston'
    const logger = winston.createLogger({
        level: data,
        levels: myCustomLevels.levels,
        format: winston.format.combine(
            winston.format.json()
        ),
        transports: [new winston.transports.Console()],
    }) as winston.Logger & Record<keyof typeof myCustomLevels['levels'], winston.LeveledLogMethod>;
    
    logger.protocol({})
    

    注意,我曾尝试扩充现有的模块定义,但因为 createLogger 被声明为具有内联函数签名的变量,我们无法真正通过扩充来扩展它。

    如果这对您来说是一个普遍问题,您可以编写一个保留级别的通用函数:

    function createWinstonLogger<T>(options?: Pick<winston.LoggerOptions, Exclude<keyof winston.LoggerOptions, 'levels'>> & { levels: T }) {
        return winston.createLogger(options) as winston.Logger & Record<keyof T, winston.LeveledLogMethod>
    }
    const logger = createWinstonLogger({
        level: data,
        levels: myCustomLevels.levels,
        format: winston.format.combine(
            winston.format.json()
        ),
        transports: [new winston.transports.Console()],
    });
    logger.protocol({})
    

    【讨论】:

    • 1.那是一个快速的反应! 2. 它有效,谢谢。
    • @leonormes 我还添加了一个创建记录器的函数..以获得更可重用的解决方案:)
    • 像魅力一样工作,但我最初认为它没有。原因是我跳过了level 参数,因为我的自定义日志级别没有直观的排名。然而,winston 将静音输出 github.com/winstonjs/winston/issues/1491 。和打字稿没关系,我一开始也这么认为。
    猜你喜欢
    • 2021-06-15
    • 2018-11-21
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-03
    • 2023-04-07
    相关资源
    最近更新 更多