로깅

ClassBinu·2024년 5월 21일

F-lab

목록 보기
34/65

로깅 설정

이렇게 간단하게 로깅을 걸 수 있었다..?

{
    name: "mysql",
    type: "mysql",
    host: "localhost",
    port: 3306,
    username: "test",
    password: "test",
    database: "test",
    ...
    logging: true
}

로깅 옵션

{
    host: "localhost",
    ...
    logging: ["query", "error"]
}

이런 옵션을 선택할 수 있지만,
query - logs all queries.
error - logs all failed queries and errors.
schema - logs the schema build process.
warn - logs internal orm warnings.
info - logs internal orm informative messages.
log - logs internal orm log messages.

다 하고 싶으면 그냥 all 걸면 됨

{
    host: "localhost",
    ...
    logging: "all"
}

시간이 오래 걸리는 쿼리 로그

이건 모든 쿼리를 대상으로 1초 이상 걸리는 쿼리를 로그한다.

{
    host: "localhost",
    ...
    maxQueryExecutionTime: 1000
}

로거

TypeORM은 기본적으로 4개의 로거를 제공함

  • advanced-console : 색상 강조로 모든 메시지를 콘솔에 기록
  • simple-console : 색상 없이 모든 메시지를 콘솔에 기록
  • file : 루트 폴더의 ormlogs.log에 기록함.
  • debug : node의 debug 패키지로 로그 처리

debug 쓰려면 환경 변수 DEBUG를 설정해야 함.
DEBUG=typeorm:* 이렇게 설정하면 TypeORM 관련 모든 로깅 메시지 활성화되며 콘솔에 출력

logging 옵션의 무시: debug 로거는 TypeORM의 logging 설정 옵션에 영향을 받지 않습니다. 즉, logging 옵션을 true나 false로 설정해도 debug 로거의 동작에는 변화가 없습니다. 로깅 활성화는 오직 DEBUG 환경 변수에 의해서만 제어됩니다.

로거 설정은 이렇게 함.

{
    host: "localhost",
    ...
    logging: true,
    logger: "file"
}

커스텀 로거

Logger 인터페이스로 커스텀 로거 생성 가능

import { Logger } from "typeorm"

export class MyCustomLogger implements Logger {
    // implement all methods from logger class
}

와.. 이런 식으로 커스텀을..?

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,
        })

        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
            }
        }
    }
}

커스텀 로거 설정하기
결국 인스턴스네

const dataSource = new DataSource({
    name: "mysql",
    type: "mysql",
    host: "localhost",
    port: 3306,
    username: "test",
    password: "test",
    database: "test",
    logger: new MyCustomLogger(),
})

0개의 댓글