跳至主内容区

日志记录

非官方测试版翻译

本页面由 PageTurner AI 翻译(测试版)。未经项目官方认可。 发现错误? 报告问题 →

启用日志记录

您只需在数据源选项中设置 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 second 的查询

更改默认日志记录器

TypeORM 内置了 5 种不同的日志记录器:

  • advanced-console - 这是默认日志记录器,使用颜色和 SQL 语法高亮将所有消息记录到控制台。

  • simple-console - 这是简易控制台日志记录器,功能与高级记录器完全相同但不使用颜色高亮。适用于存在颜色兼容问题或偏好无彩色日志的场景。

  • formatted-console - 此记录器与高级记录器几乎相同,但会格式化 SQL 查询以提升可读性(使用 @sqltools/formatter)。

  • file - 此记录器将所有日志写入指定文件(若未提供路径则默认写入当前工作目录的 ormlogs.log 文件)。

  • debug - 此记录器使用 debug 包,通过设置环境变量 DEBUG=typeorm:* 启用(注意:此记录器会将所有日志传递给控制日志级别的 debug 包)。

可通过数据源选项启用任意记录器:

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

使用自定义日志记录器

可通过实现 Logger 接口创建自定义日志记录器类:

import { Logger } from "typeorm"

export class MyCustomLogger implements Logger {
// implement all methods from logger class
}

或通过扩展 AbstractLogger 类实现:

import { AbstractLogger } from "typeorm"

export class MyCustomLogger extends AbstractLogger {
/**
* Write log to specific output.
*/
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 参数,便于记录额外数据。通过查询执行器还可获取在 persist/remove 操作期间传递的附加数据,例如:

// user sends request during entity save
postRepository.save(post, { data: { request: request } });

// in logger you can access it this way:
logQuery(query: string, parameters?: any[], queryRunner?: QueryRunner) {
const requestUrl = queryRunner && queryRunner.data["request"] ? "(" + queryRunner.data["request"].url + ") " : "";
console.log(requestUrl + "executing query: " + query);
}