gpt4 book ai didi

typeorm - 限制来自 TypeORM 的日志记录而不是禁用

转载 作者:行者123 更新时间:2023-12-04 08:00:32 25 4
gpt4 key购买 nike

我已经设置了 logging: truecreateConnection()来自 TypeORM ,在大多数情况下都可以正常工作。
但是有一种情况,我的数据字段之一来自特定的 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,可以轻松粉碎编辑器。
enter image description here

最佳答案

changing default logger 下解释在 TypeOrm 日志记录页面上。
您需要实现自己的记录器。这很简单,因为您可以对 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 而不是 promises,你可以更清楚地重写后面的代码:
// 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) });

关于typeorm - 限制来自 TypeORM 的日志记录而不是禁用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66500730/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com