跳至主内容区

日志记录

非官方测试版翻译

本页面由 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 内置四种日志记录器:

  • advanced-console - 默认日志记录器,使用彩色输出和 SQL 语法高亮在控制台显示所有消息。

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

  • formatted-console - 功能近似高级记录器,但会使用 @sqltools/formatter 格式化 SQL 查询语句以提升可读性。

  • file - 将全部日志写入项目根目录(靠近 package.json)的 ormlogs.log 文件。

  • debug - 使用 debug 包 实现,需通过环境变量 DEBUG=typeorm:* 启用(注意:日志选项对此记录器无效)。

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

{
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);
}