Skip to content

Commit dab9ead

Browse files
authoredJan 8, 2024
feat: add systemlog shim (#127)
* feat: add systemlog shim * fix: add json.stringify so its all in one line * feat: adopt structured logger from edge utils
1 parent 7d01157 commit dab9ead

File tree

2 files changed

+63
-0
lines changed

2 files changed

+63
-0
lines changed
 

‎src/run/handlers/server.ts

+2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
setVaryHeaders,
1212
} from '../headers.js'
1313
import { nextResponseProxy } from '../revalidate.js'
14+
import { logger } from '../systemlog.js'
1415

1516
let nextHandler: WorkerRequestHandler, nextConfig: NextConfigComplete, tagsManifest: TagsManifest
1617

@@ -42,6 +43,7 @@ export default async (request: Request) => {
4243
// console.log('Next server request:', req.url)
4344
await nextHandler(req, resProxy)
4445
} catch (error) {
46+
logger.withError(error).error('next handler error')
4547
console.error(error)
4648
resProxy.statusCode = 500
4749
resProxy.end('Internal Server Error')

‎src/run/systemlog.ts

+61
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
const systemLogTag = '__nfSystemLog'
2+
3+
const serializeError = (error: Error): Record<string, unknown> => {
4+
const cause = error?.cause instanceof Error ? serializeError(error.cause) : error.cause
5+
6+
return {
7+
error: error.message,
8+
error_cause: cause,
9+
error_stack: error.stack,
10+
}
11+
}
12+
13+
export class StructuredLogger {
14+
private fields: Record<string, unknown>
15+
private message: string
16+
17+
constructor(message?: string, fields?: Record<string, unknown>) {
18+
this.fields = fields ?? {}
19+
this.message = message ?? ''
20+
}
21+
22+
// TODO: add sampling
23+
private doLog(logger: typeof console.log, message: string) {
24+
logger(systemLogTag, JSON.stringify({ msg: message, fields: this.fields }))
25+
}
26+
27+
log(message: string) {
28+
this.doLog(console.log, message)
29+
}
30+
31+
info(message: string) {
32+
this.doLog(console.info, message)
33+
}
34+
35+
debug(message: string) {
36+
this.doLog(console.debug, message)
37+
}
38+
39+
warn(message: string) {
40+
this.doLog(console.warn, message)
41+
}
42+
43+
error(message: string) {
44+
this.doLog(console.error, message)
45+
}
46+
47+
withError(error: unknown) {
48+
const fields = error instanceof Error ? serializeError(error) : { error }
49+
50+
return this.withFields(fields)
51+
}
52+
53+
withFields(fields: Record<string, unknown>) {
54+
return new StructuredLogger(this.message, {
55+
...this.fields,
56+
...fields,
57+
})
58+
}
59+
}
60+
61+
export const logger = new StructuredLogger()

0 commit comments

Comments
 (0)
Please sign in to comment.