跳转到主要内容

日志

启用日志记录

您可以通过在数据源选项中设置 logging: true 来启用所有查询和错误的日志记录:

{
name: "mysql",
type: "mysql",
host: "localhost",
port: 3306,
username: "test",
password: "test",
database: "test",
...
logging: true
}

日志选项

您可以在数据源选项中启用不同类型的日志记录:

{
host: "localhost",
...
logging: ["query", "error"]
}

如果只想启用失败查询的日志记录,则只需添加 error

{
host: "localhost",
...
logging: ["error"]
}

还有其他可以使用的选项:

  • query - 记录所有查询。
  • error - 记录所有失败的查询和错误。
  • schema - 记录模式构建过程。
  • warn - 记录内部 orm 警告。
  • info - 记录内部 orm 信息消息。
  • log - 记录内部 orm 日志消息。

您可以指定任意数量的选项。 如果要启用所有日志记录,只需指定 logging: "all"

{
host: "localhost",
...
logging: "all"
}

记录长时间运行的查询

如果您遇到性能问题,可以通过在数据源选项中设置 maxQueryExecutionTime 来记录执行时间过长的查询:

{
host: "localhost",
...
maxQueryExecutionTime: 1000
}

上述代码将记录所有运行时间超过 1秒 的查询。

更改默认日志记录器

TypeORM 默认提供了 4 种不同类型的日志记录器:

  • advanced-console - 这是默认的日志记录器,将所有消息记录到控制台,并使用颜色和 SQL 语法高亮显示(使用 chalk)。
  • simple-console - 这是一个简单的控制台日志记录器,与高级日志记录器完全相同,但不使用任何颜色高亮显示。如果您遇到问题或不喜欢带颜色的日志记录,可以使用此日志记录器。
  • file - 此日志记录器将所有日志记录写入项目根文件夹(靠近 package.json)中的 ormlogs.log 文件。
  • debug - 此日志记录器使用 debug package,要启用日志记录,请设置环境变量 DEBUG=typeorm:*(注意,日志选项对此日志记录器无效)。

您可以在数据源选项中启用其中任何一个:

{
host: "localhost",
...
logging: true,
logger: "file"
}

使用自定义日志记录器

您可以通过实现 Logger 接口来创建自己的日志记录器类:

import { Logger } from "typeorm"

export class MyCustomLogger implements Logger {
// 实现日志记录器类中的所有方法
}

或者您可以扩展 AbstractLogger 类:

import { AbstractLogger } from "typeorm"

export class MyCustomLogger implements AbstractLogger {
/**
* 将日志记录到指定输出。
*/
protected writeLog(
level: LogLevel,
logMessage: LogMessage | LogMessage[],
queryRunner?: QueryRunner,
) {
const messages = this.prepareLogMessages(logMessage, {
highlightSql: false,
})

for (let message of messages) {
switch (message.type ?? level) {
case "log":
case "schema-build":
case "migration":
console.log(message.message)
break

case "info":
case "query":
if (message.prefix) {
console.info(message.prefix, message.message)
} else {
console.info(message.message)
}
break

case "warn":
case "query-slow":
if (message.prefix) {
console.warn(message.prefix, message.message)
} else {
console.warn(message.message)
}
break

case "error":
case "query-error":
if (message.prefix) {
console.error(message.prefix, message.message)
} else {
console.error(message.message)
}
break
}
}
}
}

然后在数据源选项中指定它:

import { DataSource } from "typeorm"
import { MyCustomLogger } from "./path/to/MyCustomLogger"

const dataSource = new DataSource({
name: "mysql",
type: "mysql",
host: "localhost",
port: 3306,
username: "test",
password: "test",
database: "test",
logger: new MyCustomLogger(),
})

日志记录器的方法可以接受 QueryRunner 参数(当可用时)。如果您想记录附加数据,这将非常有用。此外,通过查询运行器,您可以访问在持久化或删除期间传递的附加数据。例如:

// 用户在实体保存期间发送请求
postRepository.save(post, { data: { request: request } });

// 在日志记录器中,您可以这样访问它:
logQuery(query: string, parameters?: any[], queryRunner?: QueryRunner) {
const requestUrl = queryRunner && queryRunner.data["request"] ? "(" + queryRunner.data["request"].url + ") " : "";
console.log(requestUrl + "正在执行查询:" + query);
}