• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

typeorm / typeorm / 14796576772

02 May 2025 01:52PM UTC coverage: 45.367% (-30.9%) from 76.309%
14796576772

Pull #11434

github

web-flow
Merge ec4ce2d00 into fadad1a74
Pull Request #11434: feat: release PR releases using pkg.pr.new

5216 of 12761 branches covered (40.87%)

Branch coverage included in aggregate %.

11439 of 23951 relevant lines covered (47.76%)

15712.55 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

60.34
/src/logger/AbstractLogger.ts
1
import {
2
    Logger,
3
    LogLevel,
4
    LogMessage,
5
    LogMessageType,
6
    PrepareLogMessagesOptions,
7
} from "./Logger"
8
import { QueryRunner } from "../query-runner/QueryRunner"
9
import { LoggerOptions } from "./LoggerOptions"
10
import { PlatformTools } from "../platform/PlatformTools"
4✔
11

12
export abstract class AbstractLogger implements Logger {
4✔
13
    // -------------------------------------------------------------------------
14
    // Constructor
15
    // -------------------------------------------------------------------------
16

17
    constructor(protected options?: LoggerOptions) {}
1,864✔
18

19
    // -------------------------------------------------------------------------
20
    // Public Methods
21
    // -------------------------------------------------------------------------
22

23
    /**
24
     * Logs query and parameters used in it.
25
     */
26
    logQuery(query: string, parameters?: any[], queryRunner?: QueryRunner) {
27
        if (!this.isLogEnabledFor("query")) {
266,835✔
28
            return
266,278✔
29
        }
30

31
        this.writeLog(
557✔
32
            "query",
33
            {
34
                type: "query",
35
                prefix: "query",
36
                message: query,
37
                format: "sql",
38
                parameters,
39
            },
40
            queryRunner,
41
        )
42
    }
43

44
    /**
45
     * Logs query that is failed.
46
     */
47
    logQueryError(
48
        error: string,
49
        query: string,
50
        parameters?: any[],
51
        queryRunner?: QueryRunner,
52
    ) {
53
        if (!this.isLogEnabledFor("query-error")) {
29✔
54
            return
29✔
55
        }
56

57
        this.writeLog(
×
58
            "warn",
59
            [
60
                {
61
                    type: "query-error",
62
                    prefix: "query failed",
63
                    message: query,
64
                    format: "sql",
65
                    parameters,
66
                },
67
                {
68
                    type: "query-error",
69
                    prefix: "error",
70
                    message: error,
71
                },
72
            ],
73
            queryRunner,
74
        )
75
    }
76

77
    /**
78
     * Logs query that is slow.
79
     */
80
    logQuerySlow(
81
        time: number,
82
        query: string,
83
        parameters?: any[],
84
        queryRunner?: QueryRunner,
85
    ) {
86
        if (!this.isLogEnabledFor("query-slow")) {
×
87
            return
×
88
        }
89

90
        this.writeLog(
×
91
            "warn",
92
            [
93
                {
94
                    type: "query-slow",
95
                    prefix: "query is slow",
96
                    message: query,
97
                    format: "sql",
98
                    parameters,
99
                    additionalInfo: {
100
                        time,
101
                    },
102
                },
103
                {
104
                    type: "query-slow",
105
                    prefix: "execution time",
106
                    message: time,
107
                },
108
            ],
109
            queryRunner,
110
        )
111
    }
112

113
    /**
114
     * Logs events from the schema build process.
115
     */
116
    logSchemaBuild(message: string, queryRunner?: QueryRunner) {
117
        if (!this.isLogEnabledFor("schema-build")) {
23,920✔
118
            return
23,896✔
119
        }
120

121
        this.writeLog(
24✔
122
            "schema",
123
            {
124
                type: "schema-build",
125
                message,
126
            },
127
            queryRunner,
128
        )
129
    }
130

131
    /**
132
     * Logs events from the migration run process.
133
     */
134
    logMigration(message: string, queryRunner?: QueryRunner) {
135
        if (!this.isLogEnabledFor("migration")) {
8!
136
            return
×
137
        }
138

139
        this.writeLog(
8✔
140
            "log",
141
            {
142
                type: "migration",
143
                message,
144
            },
145
            queryRunner,
146
        )
147
    }
148

149
    /**
150
     * Perform logging using given logger, or by default to the console.
151
     * Log has its own level and message.
152
     */
153
    log(
154
        level: "log" | "info" | "warn",
155
        message: any,
156
        queryRunner?: QueryRunner,
157
    ) {
158
        switch (level) {
1,519!
159
            case "log":
160
                if (!this.isLogEnabledFor("log")) {
×
161
                    return
×
162
                }
163

164
                this.writeLog(
×
165
                    "log",
166
                    {
167
                        type: "log",
168
                        message,
169
                    },
170
                    queryRunner,
171
                )
172
                break
×
173

174
            case "info":
175
                if (!this.isLogEnabledFor("info")) {
1,519✔
176
                    return
1,519✔
177
                }
178

179
                this.writeLog(
×
180
                    "info",
181
                    {
182
                        type: "info",
183
                        prefix: "info",
184
                        message,
185
                    },
186
                    queryRunner,
187
                )
188
                break
×
189

190
            case "warn":
191
                if (!this.isLogEnabledFor("warn")) {
×
192
                    return
×
193
                }
194

195
                this.writeLog(
×
196
                    "warn",
197
                    {
198
                        type: "warn",
199
                        message,
200
                    },
201
                    queryRunner,
202
                )
203
                break
×
204
        }
205
    }
206

207
    // -------------------------------------------------------------------------
208
    // Protected Methods
209
    // -------------------------------------------------------------------------
210

211
    /**
212
     * Check is logging for level or message type is enabled.
213
     */
214
    protected isLogEnabledFor(type?: LogLevel | LogMessageType) {
215
        switch (type) {
292,311!
216
            case "query":
217
                return (
266,835✔
218
                    this.options === "all" ||
799,928✔
219
                    this.options === true ||
220
                    (Array.isArray(this.options) &&
221
                        this.options.indexOf("query") !== -1)
222
                )
223

224
            case "error":
225
            case "query-error":
226
                return (
29✔
227
                    this.options === "all" ||
87!
228
                    this.options === true ||
229
                    (Array.isArray(this.options) &&
230
                        this.options.indexOf("error") !== -1)
231
                )
232

233
            case "query-slow":
234
                return true
×
235

236
            case "schema":
237
            case "schema-build":
238
                return (
23,920✔
239
                    this.options === "all" ||
47,852✔
240
                    (Array.isArray(this.options) &&
241
                        this.options.indexOf("schema") !== -1)
242
                )
243

244
            case "migration":
245
                return true
8✔
246

247
            case "log":
248
                return (
×
249
                    this.options === "all" ||
×
250
                    (Array.isArray(this.options) &&
251
                        this.options.indexOf("log") !== -1)
252
                )
253

254
            case "info":
255
                return (
1,519✔
256
                    this.options === "all" ||
3,042✔
257
                    (Array.isArray(this.options) &&
258
                        this.options.indexOf("info") !== -1)
259
                )
260

261
            case "warn":
262
                return (
×
263
                    this.options === "all" ||
×
264
                    (Array.isArray(this.options) &&
265
                        this.options.indexOf("warn") !== -1)
266
                )
267

268
            default:
269
                return false
×
270
        }
271
    }
272

273
    /**
274
     * Write log to specific output.
275
     */
276
    protected abstract writeLog(
277
        level: LogLevel,
278
        message:
279
            | LogMessage
280
            | string
281
            | number
282
            | (LogMessage | string | number)[],
283
        queryRunner?: QueryRunner,
284
    ): void
285

286
    /**
287
     * Prepare and format log messages
288
     */
289
    protected prepareLogMessages(
290
        logMessage:
291
            | LogMessage
292
            | string
293
            | number
294
            | (LogMessage | string | number)[],
295
        options?: Partial<PrepareLogMessagesOptions>,
296
        queryRunner?: QueryRunner,
297
    ): LogMessage[] {
298
        options = {
589✔
299
            ...{
300
                addColonToPrefix: true,
301
                appendParameterAsComment: true,
302
                highlightSql: true,
303
                formatSql: false,
304
            },
305
            ...options,
306
        }
307
        const messages = Array.isArray(logMessage) ? logMessage : [logMessage]
589!
308

309
        for (let message of messages) {
589✔
310
            if (typeof message !== "object") {
589!
311
                message = {
×
312
                    message,
313
                }
314
            }
315

316
            if (message.format === "sql") {
589✔
317
                let sql = String(message.message)
557✔
318

319
                if (options.formatSql) {
557✔
320
                    sql = PlatformTools.formatSql(
12✔
321
                        sql,
322
                        queryRunner?.connection?.options.type,
323
                    )
324
                }
325

326
                if (
557!
327
                    options.appendParameterAsComment &&
1,251✔
328
                    message.parameters &&
329
                    message.parameters.length
330
                ) {
331
                    sql += ` -- PARAMETERS: ${this.stringifyParams(
×
332
                        message.parameters,
333
                    )}`
334
                }
335

336
                if (options.highlightSql) {
557✔
337
                    sql = PlatformTools.highlightSql(sql)
12✔
338
                }
339

340
                message.message = sql
557✔
341
            }
342

343
            if (options.addColonToPrefix && message.prefix) {
589✔
344
                message.prefix += ":"
12✔
345
            }
346
        }
347

348
        return messages as LogMessage[]
589✔
349
    }
350

351
    /**
352
     * Converts parameters to a string.
353
     * Sometimes parameters can have circular objects and therefor we are handle this case too.
354
     */
355
    protected stringifyParams(parameters: any[]) {
356
        try {
×
357
            return JSON.stringify(parameters)
×
358
        } catch (error) {
359
            // most probably circular objects in parameters
360
            return parameters
×
361
        }
362
    }
363
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc