【问题标题】:limit the logging from TypeORM instead of disabling限制来自 TypeORM 的日志记录,而不是禁用
【发布时间】:2021-03-10 12:05:52
【问题描述】:

我在 createConnection()TypeORM 之间设置了 logging: true,这在大多数情况下都可以正常工作。

但是有一种情况,我来自特定query/mutation 的数据字段之一可能包含一个长字符串(50000 - 300000 字符取决于输入,可能更多)。当 typeORM 尝试在 VScode 终端中记录内容时,它可以粉碎 VScode,我想知道 TypeORM 是否可以隐藏这么长的字符串而不是完全禁用所有查询日志记录。

我的理想方法类似于longstring===(基于字符串和文本省略号的修改)===>long...。或者,如有必要,只需为特定查询应用自定义记录器。

因此它仍然可以记录以指示该代码位正在以最少的信息运行。

从文档看来,我只能添加其他信息而不是修改。 https://github.com/typeorm/typeorm/blob/master/docs/logging.md

=============== 更新==============

根据接受的解决方案,我似乎没有正确理解文档。我们可以根据需要自定义记录器。由于我想切断参数。所以我可以做以下事情。

import { AdvancedConsoleLogger, Logger, LoggerOptions, QueryRunner } from "typeorm";

export class CustomLogger extends AdvancedConsoleLogger implements Logger {
    constructor(options?: LoggerOptions) {
        super(options);
    }
    //override logquery
    logQuery(query: string, paramters?: any[], queryRunner?: QueryRunner) {
        const limit = 100;
        const paramTextEllipsis = paramters?.map((param) => {
            //only cut off string and length longer than 100
            if(typeof param === "string" && param.length > limit){
                return param.substring(0, limit) + "...";
            }
            return param;
        });
        super.logQuery(query, paramTextEllipsis, queryRunner);
    }
};

来自终端的结果。注意json字符串本来就有100k以上,很容易crush editor。

【问题讨论】:

  • 最好在 typeorm 的 repo 中针对该主题打开一个问题。你不会在 stackoverflow 中找到太多关于它的信息。
  • @noamsteiner thx,我正准备在那个 repo 中打开一个新问题

标签: typeorm


【解决方案1】:

TypeOrm 日志页面的changing default logger 下对此进行了说明。

您需要实现自己的记录器。这很简单,因为您可以继承 TypeOrm 提供的标准记录器之一,检查日志查询字符串是否太长,然后调用继承的日志方法。

例如,子类化“高级控制台”记录器,这是 TypeOrm 使用的默认记录器。

import { Logger, QueryRunner, AdvancedConsoleLogger, LoggerOptions } from "typeorm";

export class MyCustomLogger extends AdvancedConsoleLogger implements Logger {

    constructor(options?: LoggerOptions) {
        super(options);
    }    

    logQuery(query: string, parameters?: any[], queryRunner?: QueryRunner) {
        let logText = query;
        if (logText.length > 100)
            // Truncate the log text if it's too long:
            logText = logText.substring(0, 10) + "...";
        super.logQuery(logText, parameters, queryRunner);
    }
}

您可以覆盖更多 4 种方法,但您可以在实现中省略这些方法,它将使用继承的方法:

logQueryError(error: string, query: string, parameters?: any[], queryRunner?: QueryRunner)
logQuerySlow(time: number, query: string, parameters?: any[], queryRunner?: QueryRunner)
logSchemaBuild(message: string, queryRunner?: QueryRunner) 
logMigration(message: string, queryRunner?: QueryRunner)
log(level: "log" | "info" | "warn", message: any, queryRunner?: QueryRunner)

现在您已经创建了自定义记录器,如何使用在using custom logger 下进行了说明。

您需要稍微更改页面上的示例以添加所需的日志记录选项;日志记录选项在logging options 下进行了说明,例如:(true)("All")(["query", "error"])

import {createConnection} from "typeorm";
import {MyCustomLogger} from "./logger/MyCustomLogger";

createConnection({
    name: "mysql",
    type: "mysql",
    host: "localhost",
    port: 3306,
    username: "test",
    password: "test",
    database: "test",
    logger: new MyCustomLogger(true) // Logging option "true" = enable logging
});

或者在使用 ormconfig.json 配置文件时:

import {createConnection, getConnectionOptions} from "typeorm";
import {MyCustomLogger} from "./logger/MyCustomLogger";

// getConnectionOptions will read options from your ormconfig file
// and return it in connectionOptions object
// then you can simply append additional properties to it
getConnectionOptions().then(connectionOptions => {
    return createConnection(Object.assign(connectionOptions, {
        logger: new MyCustomLogger(connectionOptions.logging) // pass in logging options specified in the ormconfig.json file
    }))
});

如果你使用的是 async/await 而不是 Promise,你可以更清楚地重写后面的代码:

// getConnectionOptions reads options from your ormconfig file
const options = await getConnectionOptions();
// append MyCustomLogger to the connection options
await createConnection({ ...options, logger: new MyCustomLogger(options.logging) });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    • 2019-10-29
    • 1970-01-01
    • 1970-01-01
    • 2018-07-17
    • 2011-06-22
    • 2015-04-21
    相关资源
    最近更新 更多