Adding new database logger for logging database related things

This commit is contained in:
Collin Duncan 2023-08-29 10:44:12 +02:00
parent 09de8ecff3
commit 135b9930f6
No known key found for this signature in database
12 changed files with 98 additions and 14 deletions

View file

@ -8,6 +8,7 @@ import { resolve } from 'path'
import { EmailModule } from './email/module'
import { LoggerMiddleware } from './logger/middleware'
import { LoggerModule } from './logger/module'
import { DatabaseLoggerService } from './logger/service.database_logger'
import { RecurringReservationsModule } from './recurringReservations/module'
import { ReservationsModule } from './reservations/module'
import { RunnerModule } from './runner/module'
@ -17,9 +18,12 @@ import { WaitingListModule } from './waitingList/module'
imports: [
ConfigModule.forRoot({ isGlobal: true }),
TypeOrmModule.forRootAsync({
imports: [ConfigModule],
inject: [ConfigService],
useFactory: (configService: ConfigService) => ({
imports: [ConfigModule, LoggerModule],
inject: [ConfigService, DatabaseLoggerService],
useFactory: (
configService: ConfigService,
databaseLoggerService: DatabaseLoggerService,
) => ({
type: 'sqlite',
database: configService.get<string>(
'DATABASE',
@ -28,6 +32,7 @@ import { WaitingListModule } from './waitingList/module'
migrations: [],
autoLoadEntities: true,
logging: true,
logger: databaseLoggerService,
}),
}),
BullModule.forRootAsync({

View file

@ -3,7 +3,7 @@ import { ConfigService } from '@nestjs/config'
import * as Imap from 'imap'
import { MailParser, ParsedEmail } from 'mailparser-mit'
import { LoggerService } from '../logger/service'
import { LoggerService } from '../logger/service.logger'
import { Email } from './types'
export enum EmailClientStatus {

View file

@ -1,7 +1,7 @@
import { Inject, Injectable, NestMiddleware } from '@nestjs/common'
import { NextFunction, Request, Response } from 'express'
import { LoggerService } from './service'
import { LoggerService } from './service.logger'
@Injectable()
export class LoggerMiddleware implements NestMiddleware {

View file

@ -1,10 +1,11 @@
import { Module } from '@nestjs/common'
import { LoggerMiddleware } from './middleware'
import { LoggerService } from './service'
import { DatabaseLoggerService } from './service.database_logger'
import { LoggerService } from './service.logger'
@Module({
providers: [LoggerService, LoggerMiddleware],
exports: [LoggerService, LoggerMiddleware],
providers: [LoggerService, DatabaseLoggerService, LoggerMiddleware],
exports: [LoggerService, DatabaseLoggerService, LoggerMiddleware],
})
export class LoggerModule {}

View file

@ -0,0 +1,72 @@
/* eslint-disable @typescript-eslint/no-unused-vars */
import { Inject, Injectable } from '@nestjs/common'
import { Logger, QueryRunner } from 'typeorm'
import { LoggerService } from './service.logger'
@Injectable()
export class DatabaseLoggerService implements Logger {
constructor(
@Inject(LoggerService)
private loggerService: LoggerService,
) {}
logQuery(
query: string,
parameters?: any[] | undefined,
_queryRunner?: QueryRunner | undefined,
) {
this.loggerService.debug('Query', `${query} - ${parameters?.join(',')}`)
}
logQueryError(
error: string | Error,
query: string,
parameters?: any[] | undefined,
_queryRunner?: QueryRunner | undefined,
) {
this.loggerService.error(
'Query error',
`${error}: ${query} - ${parameters?.join(',')}`,
)
}
logQuerySlow(
time: number,
query: string,
parameters?: any[] | undefined,
_queryRunner?: QueryRunner | undefined,
) {
this.loggerService.warn(
'Slow query',
`${query} - ${parameters?.join(',')} took ${time}`,
)
}
logSchemaBuild(message: string, _queryRunner?: QueryRunner | undefined) {
this.log('info', message)
}
logMigration(message: string, _queryRunner?: QueryRunner | undefined) {
this.log('info', message)
}
log(
level: 'log' | 'info' | 'warn',
message: any,
_queryRunner?: QueryRunner | undefined,
) {
let logFn: (message: any) => void
switch (level) {
case 'warn':
logFn = this.loggerService.warn
break
case 'log':
case 'info':
default:
logFn = this.loggerService.log
}
logFn(message)
}
}

View file

@ -2,7 +2,7 @@ import { Inject, Injectable } from '@nestjs/common'
import { Cron, CronExpression } from '@nestjs/schedule'
import dayjs from '../common/dayjs'
import { LoggerService } from '../logger/service'
import { LoggerService } from '../logger/service.logger'
import { RecurringReservationsService } from './service'
@Injectable()
@ -20,6 +20,7 @@ export class RecurringReservationsCronService {
timeZone: 'Europe/Amsterdam',
})
async handleRecurringReservations() {
this.loggerService.log('handleRecurringReservations beginning')
const dayOfWeek = dayjs().get('day')
const recurringReservationsToSchedule =
await this.recurringReservationsService.getByDayOfWeek(dayOfWeek)
@ -31,5 +32,6 @@ export class RecurringReservationsCronService {
recurringReservation,
)
}
this.loggerService.log('handleRecurringReservations ending')
}
}

View file

@ -16,7 +16,7 @@ import {
import { Queue } from 'bull'
import { Dayjs } from 'dayjs'
import { LoggerService } from '../logger/service'
import { LoggerService } from '../logger/service.logger'
import { RESERVATIONS_QUEUE_NAME } from './config'
import { Reservation } from './entity'
import { ReservationsService } from './service'

View file

@ -4,7 +4,7 @@ import { Cron, CronExpression } from '@nestjs/schedule'
import { Queue } from 'bull'
import dayjs from '../common/dayjs'
import { LoggerService } from '../logger/service'
import { LoggerService } from '../logger/service.logger'
import { RESERVATIONS_QUEUE_NAME } from './config'
import { ReservationsService } from './service'
@ -26,6 +26,7 @@ export class ReservationsCronService {
timeZone: 'Europe/Amsterdam',
})
async handleDailyReservations() {
this.loggerService.log('handleDailyReservations beginning')
const reservationsToPerform = await this.reservationService.getByDate(
dayjs().subtract(7, 'days'),
)
@ -35,6 +36,7 @@ export class ReservationsCronService {
await this.reservationsQueue.addBulk(
reservationsToPerform.map((r) => ({ data: r, opts: { attempts: 1 } })),
)
this.loggerService.log('handleDailyReservations ending')
}
@Cron(CronExpression.EVERY_DAY_AT_11PM, {
@ -42,6 +44,7 @@ export class ReservationsCronService {
timeZone: 'Europe/Amsterdam',
})
async cleanUpExpiredReservations() {
this.loggerService.log('cleanUpExpiredReservations beginning')
const reservations = await this.reservationService.getByDate()
this.loggerService.log(
`Found ${reservations.length} reservations to delete`,
@ -49,5 +52,6 @@ export class ReservationsCronService {
for (const reservation of reservations) {
await this.reservationService.deleteById(reservation.id)
}
this.loggerService.log('cleanUpExpiredReservations ending')
}
}

View file

@ -3,7 +3,7 @@ import { Inject } from '@nestjs/common'
import { Job } from 'bull'
import { instanceToPlain, plainToInstance } from 'class-transformer'
import { LoggerService } from '../logger/service'
import { LoggerService } from '../logger/service.logger'
import {
BaanReserverenService,
NoCourtAvailableError,

View file

@ -2,7 +2,7 @@ import { Inject, Injectable } from '@nestjs/common'
import { instanceToPlain } from 'class-transformer'
import { Dayjs } from 'dayjs'
import { ElementHandle, Page } from 'puppeteer'
import { LoggerService } from 'src/logger/service'
import { LoggerService } from 'src/logger/service.logger'
import dayjs from '../../common/dayjs'
import { Reservation } from '../../reservations/entity'

View file

@ -6,7 +6,7 @@ import { ReservationsService } from 'src/reservations/service'
import dayjs from '../common/dayjs'
import { EMAILS_QUEUE_NAME } from '../email/config'
import { Email } from '../email/types'
import { LoggerService } from '../logger/service'
import { LoggerService } from '../logger/service.logger'
import { RESERVATIONS_QUEUE_NAME } from '../reservations/config'
import { WaitingListDetails } from './types'