Skip to content

Commit 0d598f6

Browse files
committed
add error log level
1 parent 23fc7a2 commit 0d598f6

File tree

3 files changed

+65
-16
lines changed

3 files changed

+65
-16
lines changed

src/driver/runtime-driver.ts

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -105,17 +105,33 @@ class RuntimeConnection implements DatabaseConnection {
105105

106106
try {
107107
return await this.#connection.executeQuery<R>(compiledQuery)
108+
} catch (error) {
109+
this.#logError(error)
110+
throw error
108111
} finally {
109-
this.#log.query((log) => {
110-
log(compiledQuery.sql)
111-
log(`duration: ${this.#calculateDurationMillis(startTime)}ms`)
112-
})
112+
this.#logQuery(compiledQuery, startTime)
113113
}
114114
}
115115

116+
#logError(error: unknown): void {
117+
this.#log.error(() => ({
118+
level: 'error',
119+
error,
120+
}))
121+
}
122+
123+
#logQuery(compiledQuery: CompiledQuery, startTime: bigint): void {
124+
this.#log.query(() => ({
125+
level: 'query',
126+
sql: compiledQuery.sql,
127+
queryDurationMillis: this.#calculateDurationMillis(startTime),
128+
}))
129+
}
130+
116131
#calculateDurationMillis(startTime: bigint): number {
117132
const endTime = process.hrtime.bigint()
118-
const durationTensMillis = Number((endTime - startTime) / 1_00_000n)
119-
return durationTensMillis / 10
133+
const durationNanos = Number(endTime - startTime)
134+
135+
return durationNanos / 1_000_000
120136
}
121137
}

src/kysely.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -358,12 +358,13 @@ export interface KyselyConfig {
358358
/**
359359
* A list of log levels to log.
360360
*
361-
* Currently there's only one level: `query` and it's logged using
362-
* `console.log`. This will be expanded based on user request later.
361+
* Currently there's only two levels: `query` and `error`.
362+
* This will be expanded based on user feedback later.
363363
*
364364
* Log levels:
365365
*
366-
* - query: Log each query's SQL and duration.
366+
* - query: Log each query's SQL and duration using console.log
367+
* - error: Log all query errors using console.error
367368
*/
368369
readonly log?: ReadonlyArray<LogLevel>
369370
}

src/util/log.ts

Lines changed: 39 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,56 @@
1+
import { freeze } from './object-utils.js'
12
import { ArrayItemType } from './type-utils.js'
23

3-
export const LOG_LEVELS = ['query'] as const
4+
export const LOG_LEVELS = ['query', 'error'] as const
45
export type LogLevel = ArrayItemType<typeof LOG_LEVELS>
56

67
export class Log {
78
#levels: Readonly<Record<LogLevel, boolean>>
89

910
constructor(levels: ReadonlyArray<LogLevel>) {
10-
this.#levels = {
11+
this.#levels = freeze({
1112
query: levels.includes('query'),
12-
}
13+
error: levels.includes('error'),
14+
})
1315
}
1416

15-
query(callback: (log: (message: string) => void) => void) {
17+
query(getEvent: () => QueryLogEvent) {
1618
if (this.#levels.query) {
17-
callback(this.#query)
19+
this.#defaultQuery(getEvent())
20+
}
21+
}
22+
23+
error(getEvent: () => ErrorLogEvent) {
24+
if (this.#levels.error) {
25+
this.#defaultError(getEvent())
1826
}
1927
}
2028

21-
#query(message: string) {
22-
console.log(`kysely:query: ${message}`)
29+
#defaultQuery(event: QueryLogEvent) {
30+
console.log(`kysely:query: ${event.sql}`)
31+
console.log(
32+
`kysely:query: duration: ${event.queryDurationMillis.toFixed(1)}ms`
33+
)
34+
}
35+
36+
#defaultError(event: ErrorLogEvent) {
37+
if (event.error instanceof Error) {
38+
console.error(`kysely:error: ${event.error.stack ?? event.error.message}`)
39+
} else {
40+
console.error(`kysely:error: ${event}`)
41+
}
2342
}
2443
}
44+
45+
export type LogEvent = QueryLogEvent | ErrorLogEvent
46+
47+
export interface QueryLogEvent {
48+
readonly level: 'query'
49+
readonly sql: string
50+
readonly queryDurationMillis: number
51+
}
52+
53+
export interface ErrorLogEvent {
54+
readonly level: 'error'
55+
readonly error: unknown
56+
}

0 commit comments

Comments
 (0)