Перейти к основному содержанию

Логирование

Неофициальный Бета-перевод

Эта страница переведена 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);
}