日志
启用日志记录
您可以通过在数据源选项中设置 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);
}