跳到主要内容

日志记录

启用日志记录

只需在数据源选项中设置 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 附带 5 种不同的内置日志器:

  • advanced-console - 这是默认日志器,它会使用颜色和 SQL 语法高亮将所有消息记录到控制台。
  • simple-console - 这是一个简单的控制台日志器,它与 advanced 日志器完全相同,但不使用任何颜色高亮。如果你遇到问题 / 或者不喜欢彩色日志,可以使用此日志器。
  • formatted-console - 这几乎与 advanced 日志器相同,但它会将 SQL 查询格式化得更易读(使用 @sqltools/formatter)。
  • file - 此日志器会将所有日志写入指定文件(如果未提供路径,则写入当前工作目录下的 ormlogs.log)。
  • debug - 此日志器使用 debug package;要启用日志,请设置环境变量 DEBUG=typeorm:*(注意:该日志器会将所有日志传递给 debug 包,由它控制日志级别设置)。

你可以在数据源选项中启用任意一个日志器:

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

使用自定义日志器

你可以通过实现 Logger 接口来创建自己的日志类:

import { Logger } from "typeorm"

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

或者你可以继承 AbstractLogger 类:

import { AbstractLogger } from "typeorm"

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

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 "./logger/MyCustomLogger"

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

当可用时,日志方法可以接受 QueryRunner。这对于你希望记录额外数据时非常有用。 此外,通过 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);
}