refactor: replace logger

Signed-off-by: Innei <i@innei.in>
This commit is contained in:
Innei
2023-11-26 22:43:02 +08:00
parent a42bde6163
commit 6913dc9855
10 changed files with 74 additions and 104 deletions

View File

@@ -1,4 +0,0 @@
module.exports = {
...require('@innei/prettier'),
importOrderParserPlugins: ['typescript', 'jsx', 'decorators-legacy'],
}

8
.prettierrc.mjs Normal file
View File

@@ -0,0 +1,8 @@
import { factory } from '@innei/prettier'
export default {
...factory({
tailwindcss: false,
}),
importOrderParserPlugins: ['typescript', 'jsx', 'decorators-legacy'],
}

View File

@@ -1 +0,0 @@
module.exports = require('../../.prettierrc.cjs')

View File

@@ -1,9 +1,9 @@
import type { Consola } from 'consola'
import type { Document, PaginateModel } from 'mongoose' import type { Document, PaginateModel } from 'mongoose'
import 'zx-cjs/globals' import 'zx-cjs/globals'
import type { ModelType } from '@typegoose/typegoose/lib/types' import type { ModelType } from '@typegoose/typegoose/lib/types'
import type { WrappedConsola } from 'nestjs-pretty-logger/lib/consola'
declare global { declare global {
export type KV<T = any> = Record<string, T> export type KV<T = any> = Record<string, T>
@@ -13,7 +13,7 @@ declare global {
export const isDev: boolean export const isDev: boolean
export const consola: Consola export const consola: WrappedConsola
export const cwd: string export const cwd: string
} }

View File

@@ -82,7 +82,6 @@
"class-validator": "0.13.2", "class-validator": "0.13.2",
"class-validator-jsonschema": "npm:@innei/class-validator-jsonschema@3.1.2", "class-validator-jsonschema": "npm:@innei/class-validator-jsonschema@3.1.2",
"commander": "11.1.0", "commander": "11.1.0",
"consola": "^2.15.3",
"dayjs": "1.11.10", "dayjs": "1.11.10",
"ejs": "3.1.9", "ejs": "3.1.9",
"form-data": "4.0.0", "form-data": "4.0.0",
@@ -107,6 +106,7 @@
"mongoose-lean-virtuals": "0.9.1", "mongoose-lean-virtuals": "0.9.1",
"mongoose-paginate-v2": "1.7.31", "mongoose-paginate-v2": "1.7.31",
"nanoid": "3.3.4", "nanoid": "3.3.4",
"nestjs-pretty-logger": "0.1.0-5",
"node-machine-id": "1.1.12", "node-machine-id": "1.1.12",
"node-pty": "1.0.0", "node-pty": "1.0.0",
"nodemailer": "6.9.7", "nodemailer": "6.9.7",
@@ -160,4 +160,4 @@
"mongodb-memory-server": "^9.1.1", "mongodb-memory-server": "^9.1.1",
"redis-memory-server": "^0.9.0" "redis-memory-server": "^0.9.0"
} }
} }

View File

@@ -1,97 +1,32 @@
/* eslint-disable prefer-rest-params */ /* eslint-disable prefer-rest-params */
import { createWriteStream } from 'fs'
import consola_, { FancyReporter, LogLevel } from 'consola'
import { CronJob } from 'cron'
import { CronExpression } from '@nestjs/schedule' /* eslint-disable prefer-rest-params */
import { createLogger } from 'nestjs-pretty-logger'
import { getTodayLogFilePath } from '~/utils/path.util' import { LOG_DIR } from '~/constants/path.constant'
import { redisSubPub } from '../utils/redis-subpub.util' import { redisSubPub } from '../utils/redis-subpub.util'
import { getShortTime } from '../utils/time.util'
import { isDebugMode, isDev, isTest } from './env.global'
class Reporter extends FancyReporter { const logger = createLogger({
isInVirtualTerminal = typeof process.stdout.columns === 'undefined' // HACK: if got `undefined` that means in PM2 pty writeToFile: {
private latestLogTime: number = Date.now() loggerDir: LOG_DIR,
protected formatDate(date: Date): string { },
if (isDev) { })
const now = Date.now() logger.wrapAll()
const delta = now - this.latestLogTime logger.onData((data) => {
this.latestLogTime = now redisSubPub.publish('log', data)
return `+${delta | 0}ms ${super.formatDate(date)}`
}
return this.isInVirtualTerminal ? '' : super.formatDate(date)
}
protected formatLogObj(): string {
return this.isInVirtualTerminal
? `${chalk.gray(getShortTime(new Date()))} ${super.formatLogObj
.apply(this, arguments)
.replace(/^\n/, '')}`.trimEnd()
: super.formatLogObj.apply(this, arguments)
}
}
export const consola = consola_.create({
reporters: [new Reporter()],
level: isDev || isDebugMode ? LogLevel.Trace : LogLevel.Info,
}) })
export function registerStdLogger() {
let logStream = createWriteStream(getTodayLogFilePath(), {
encoding: 'utf-8',
flags: 'a+',
})
logStream.write( // HACK: forhidden pm2 to override this method
'\n========================================================\n', Object.defineProperty(process.stdout, 'write', {
) value: process.stdout.write,
writable: false,
configurable: false,
})
Object.defineProperty(process.stderr, 'write', {
value: process.stdout.write,
writable: false,
configurable: false,
})
const job = new CronJob(CronExpression.EVERY_DAY_AT_MIDNIGHT, () => { export { logger as consola }
logStream.destroy()
logStream = createWriteStream(getTodayLogFilePath(), {
encoding: 'utf-8',
flags: 'a+',
})
logStream.write(
'\n========================================================\n',
)
})
job.start()
const stdout = process.stdout.write
const stderr = process.stderr.write
function log(data: string) {
if (isTest) {
return
}
logStream.write(data)
redisSubPub.publish('log', data)
}
process.stdout.write = function () {
log(arguments[0])
return stdout.apply(this, arguments)
}
process.stderr.write = function () {
log(arguments[0])
return stderr.apply(this, arguments)
}
consola.wrapAll()
// HACK: forhidden pm2 to override this method
Object.defineProperty(process.stdout, 'write', {
value: process.stdout.write,
writable: false,
configurable: false,
})
Object.defineProperty(process.stderr, 'write', {
value: process.stdout.write,
writable: false,
configurable: false,
})
}

View File

@@ -15,7 +15,7 @@ import {
USER_ASSET_DIR, USER_ASSET_DIR,
} from '~/constants/path.constant' } from '~/constants/path.constant'
import { consola, registerStdLogger } from './consola.global' import { consola } from './consola.global'
import './dayjs.global' import './dayjs.global'
@@ -58,7 +58,7 @@ function registerGlobal() {
export function register() { export function register() {
registerGlobal() registerGlobal()
registerStdLogger()
registerJSONGlobal() registerJSONGlobal()
mkdirs() mkdirs()

View File

@@ -1,5 +1,5 @@
import type { Consola } from 'consola'
import type { Document, PaginateModel } from 'mongoose' import type { Document, PaginateModel } from 'mongoose'
import type { WrappedConsola } from 'nestjs-pretty-logger/lib/consola'
import 'vitest/globals' import 'vitest/globals'
import 'zx-cjs/globals' import 'zx-cjs/globals'
@@ -14,7 +14,7 @@ declare global {
export const isDev: boolean export const isDev: boolean
export const consola: Consola export const consola: WrappedConsola
export const cwd: string export const cwd: string
interface JSON { interface JSON {

View File

@@ -3,7 +3,7 @@ import { beforeAll } from 'vitest'
import 'zx/globals' import 'zx/globals'
import consola from 'consola' import { createConsola } from 'nestjs-pretty-logger'
import { dbHelper } from 'test/helper/db-mock.helper' import { dbHelper } from 'test/helper/db-mock.helper'
import { redisHelper } from 'test/helper/redis-mock.helper' import { redisHelper } from 'test/helper/redis-mock.helper'
@@ -14,7 +14,7 @@ beforeAll(async () => {
global.isDev = true global.isDev = true
global.cwd = process.cwd() global.cwd = process.cwd()
global.consola = consola global.consola = createConsola()
registerJSONGlobal() registerJSONGlobal()
}) })

34
pnpm-lock.yaml generated
View File

@@ -247,6 +247,9 @@ importers:
nanoid: nanoid:
specifier: 3.3.4 specifier: 3.3.4
version: 3.3.4 version: 3.3.4
nestjs-pretty-logger:
specifier: 0.1.0-5
version: 0.1.0-5(class-transformer@0.5.1)(class-validator@0.13.2)(reflect-metadata@0.1.13)(rxjs@7.8.1)
node-machine-id: node-machine-id:
specifier: 1.1.12 specifier: 1.1.12
version: 1.1.12 version: 1.1.12
@@ -1351,6 +1354,11 @@ packages:
- supports-color - supports-color
dev: true dev: true
/@innei/string-width@7.0.0-fork.1:
resolution: {integrity: sha512-A9KZC0dExzZnxV/eWkqosFeYPwfR+tN9aZ7oSNQBxg9cJtopGXTqRwZON26TrDjbfDFJurxmG24GE6mpPGjEig==}
engines: {node: '>=18'}
dev: false
/@ioredis/commands@1.1.1: /@ioredis/commands@1.1.1:
resolution: {integrity: sha512-fsR4P/ROllzf/7lXYyElUJCheWdTJVJvOTps8v9IWKFATxR61ANOlnoPqhH099xYLrJGpc2ZQ28B3rMeUt5VQg==} resolution: {integrity: sha512-fsR4P/ROllzf/7lXYyElUJCheWdTJVJvOTps8v9IWKFATxR61ANOlnoPqhH099xYLrJGpc2ZQ28B3rMeUt5VQg==}
@@ -3538,7 +3546,6 @@ packages:
dependencies: dependencies:
'@types/luxon': 3.3.3 '@types/luxon': 3.3.3
luxon: 3.4.3 luxon: 3.4.3
dev: true
/cross-env@7.0.3: /cross-env@7.0.3:
resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==}
@@ -3693,6 +3700,10 @@ packages:
has-property-descriptors: 1.0.0 has-property-descriptors: 1.0.0
object-keys: 1.1.1 object-keys: 1.1.1
/defu@6.1.3:
resolution: {integrity: sha512-Vy2wmG3NTkmHNg/kzpuvHhkqeIx3ODWqasgCRbKtbXEN0G+HpEEv9BtJLp7ZG1CZloFaC41Ah3ZFbq7aqCqMeQ==}
dev: false
/delayed-stream@1.0.0: /delayed-stream@1.0.0:
resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
engines: {node: '>=0.4.0'} engines: {node: '>=0.4.0'}
@@ -6449,6 +6460,23 @@ packages:
resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==}
dev: true dev: true
/nestjs-pretty-logger@0.1.0-5(class-transformer@0.5.1)(class-validator@0.13.2)(reflect-metadata@0.1.13)(rxjs@7.8.1):
resolution: {integrity: sha512-LhQNI2I6cBp6ksGDgin7ofkN9pMvBrN0s5IAOqX/wPNH6XZkW4VBaGcOlup26qzcbMK7bch1O+Pgf9SjxrbuJQ==}
dependencies:
cron: 3.1.6
defu: 6.1.3
picocolors: 1.0.0
std-env: 3.5.0
string-width: /@innei/string-width@7.0.0-fork.1
optionalDependencies:
'@nestjs/common': 10.2.10(class-transformer@0.5.1)(class-validator@0.13.2)(reflect-metadata@0.1.13)(rxjs@7.8.1)
transitivePeerDependencies:
- class-transformer
- class-validator
- reflect-metadata
- rxjs
dev: false
/new-find-package-json@2.0.0: /new-find-package-json@2.0.0:
resolution: {integrity: sha512-lDcBsjBSMlj3LXH2v/FW3txlh2pYTjmbOXPYJD93HI5EwuLzI11tdHSIpUMmfq/IOsldj4Ps8M8flhm+pCK4Ew==} resolution: {integrity: sha512-lDcBsjBSMlj3LXH2v/FW3txlh2pYTjmbOXPYJD93HI5EwuLzI11tdHSIpUMmfq/IOsldj4Ps8M8flhm+pCK4Ew==}
engines: {node: '>=12.22.0'} engines: {node: '>=12.22.0'}
@@ -7673,6 +7701,10 @@ packages:
resolution: {integrity: sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q==} resolution: {integrity: sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q==}
dev: true dev: true
/std-env@3.5.0:
resolution: {integrity: sha512-JGUEaALvL0Mf6JCfYnJOTcobY+Nc7sG/TemDRBqCA0wEr4DER7zDchaaixTlmOxAjG1uRJmX82EQcxwTQTkqVA==}
dev: false
/stream-combiner@0.0.4: /stream-combiner@0.0.4:
resolution: {integrity: sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==} resolution: {integrity: sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==}
dependencies: dependencies: