Логирование
Эта страница переведена 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- простой консольный логгер, идентичный advanced, но без цветового выделения.
Подходит при проблемах с цветными логами или личных предпочтениях. -
formatted-console- аналогичен advanced, но форматирует SQL-запросы для лучшей читаемости с помощью @sqltools/formatter. -
file- записывает все логи в файлormlogs.logв корне проекта (рядом сpackage.json). -
debug- использует пакет debug; для активации установите переменную окруженияDEBUG=typeorm:*(опция logging не влияет на этот логгер).
Любой из них можно активировать в настройках источника данных:
{
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 при его наличии. Это полезно для логирования дополнительных данных.
Через query runner также доступны дополнительные данные, передаваемые при операциях сохранения/удаления. Например:
// 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);
}