日志记录
本页面由 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);
}