Skip to content

Commit a6d09f3

Browse files
authoredJun 12, 2024
fix: set systemlogger debug log level for debug requests (#571)
1 parent ac0c205 commit a6d09f3

File tree

9 files changed

+34
-23
lines changed

9 files changed

+34
-23
lines changed
 

‎src/build/content/server.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import glob from 'fast-glob'
1919
import { prerelease, lt as semverLowerThan, lte as semverLowerThanOrEqual } from 'semver'
2020

2121
import { RUN_CONFIG } from '../../run/constants.js'
22-
import { logger } from '../../run/systemlog.cjs'
2322
import { PluginContext } from '../plugin-context.js'
2423
import { verifyNextVersion } from '../verification.js'
2524

@@ -342,7 +341,7 @@ export const writeTagsManifest = async (ctx: PluginContext): Promise<void> => {
342341
} catch {
343342
// Parallel route default layout has no prerendered page, so don't warn about it
344343
if (!definition.dataRoute?.endsWith('/default.rsc')) {
345-
logger.log(`Unable to read cache tags for: ${path}`)
344+
console.log(`Unable to read cache tags for: ${path}`)
346345
}
347346
}
348347
}

‎src/build/templates/handler-monorepo.tmpl.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ export default async function (req, context) {
1616
tracing.start()
1717
}
1818

19-
const requestContext = createRequestContext(req.headers.get('x-next-debug-logging'))
19+
const requestContext = createRequestContext(req)
2020
const tracer = getTracer()
2121

2222
const handlerResponse = await runWithRequestContext(requestContext, () => {

‎src/build/templates/handler.tmpl.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export default async function handler(req, context) {
1313
if (process.env.NETLIFY_OTLP_TRACE_EXPORTER_URL) {
1414
tracing.start()
1515
}
16-
const requestContext = createRequestContext(req.headers.get('x-next-debug-logging'))
16+
const requestContext = createRequestContext(req)
1717
const tracer = getTracer()
1818

1919
const handlerResponse = await runWithRequestContext(requestContext, () => {

‎src/run/handlers/cache.cts

+8-9
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,8 @@ import type {
1717
NetlifyIncrementalCacheValue,
1818
} from '../../shared/cache-types.cjs'
1919
import { getRegionalBlobStore } from '../regional-blob-store.cjs'
20-
import { logger } from '../systemlog.cjs'
2120

22-
import { getRequestContext } from './request-context.cjs'
21+
import { getLogger, getRequestContext } from './request-context.cjs'
2322
import { getTracer } from './tracer.cjs'
2423

2524
type TagManifest = { revalidatedAt: number }
@@ -109,7 +108,7 @@ export class NetlifyCacheHandler implements CacheHandler {
109108
async get(...args: Parameters<CacheHandler['get']>): ReturnType<CacheHandler['get']> {
110109
return this.tracer.withActiveSpan('get cache key', async (span) => {
111110
const [key, ctx = {}] = args
112-
logger.debug(`[NetlifyCacheHandler.get]: ${key}`)
111+
getLogger().debug(`[NetlifyCacheHandler.get]: ${key}`)
113112

114113
const blobKey = await this.encodeBlobKey(key)
115114
span.setAttributes({ key, blobKey })
@@ -177,7 +176,7 @@ export class NetlifyCacheHandler implements CacheHandler {
177176
const lastModified = Date.now()
178177
span.setAttributes({ key, lastModified, blobKey })
179178

180-
logger.debug(`[NetlifyCacheHandler.set]: ${key}`)
179+
getLogger().debug(`[NetlifyCacheHandler.set]: ${key}`)
181180

182181
const value: NetlifyIncrementalCacheValue | null =
183182
data?.kind === 'ROUTE'
@@ -198,10 +197,10 @@ export class NetlifyCacheHandler implements CacheHandler {
198197
const requestContext = getRequestContext()
199198
if (requestContext?.didPagesRouterOnDemandRevalidate) {
200199
const tag = `_N_T_${key === '/index' ? '/' : key}`
201-
logger.debug(`Purging CDN cache for: [${tag}]`)
200+
getLogger().debug(`Purging CDN cache for: [${tag}]`)
202201
purgeCache({ tags: [tag] }).catch((error) => {
203202
// TODO: add reporting here
204-
logger
203+
getLogger()
205204
.withError(error)
206205
.error(`[NetlifyCacheHandler]: Purging the cache for tag ${tag} failed`)
207206
})
@@ -212,7 +211,7 @@ export class NetlifyCacheHandler implements CacheHandler {
212211

213212
// eslint-disable-next-line @typescript-eslint/no-explicit-any
214213
async revalidateTag(tagOrTags: string | string[], ...args: any) {
215-
logger.withFields({ tagOrTags, args }).debug('NetlifyCacheHandler.revalidateTag')
214+
getLogger().withFields({ tagOrTags, args }).debug('NetlifyCacheHandler.revalidateTag')
216215

217216
const tags = Array.isArray(tagOrTags) ? tagOrTags : [tagOrTags]
218217

@@ -225,14 +224,14 @@ export class NetlifyCacheHandler implements CacheHandler {
225224
try {
226225
await this.blobStore.setJSON(await this.encodeBlobKey(tag), data)
227226
} catch (error) {
228-
logger.withError(error).log(`Failed to update tag manifest for ${tag}`)
227+
getLogger().withError(error).log(`Failed to update tag manifest for ${tag}`)
229228
}
230229
}),
231230
)
232231

233232
purgeCache({ tags }).catch((error) => {
234233
// TODO: add reporting here
235-
logger
234+
getLogger()
236235
.withError(error)
237236
.error(`[NetlifyCacheHandler]: Purging the cache for tags ${tags.join(', ')} failed`)
238237
})

‎src/run/handlers/request-context.cts

+17-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
import { AsyncLocalStorage } from 'node:async_hooks'
22

3+
import { LogLevel, systemLogger } from '@netlify/functions/internal'
4+
35
import type { NetlifyCachedRouteValue } from '../../shared/cache-types.cjs'
46

7+
type SystemLogger = typeof systemLogger
8+
59
export type RequestContext = {
6-
debug: boolean
10+
captureServerTiming: boolean
711
responseCacheGetLastModified?: number
812
responseCacheKey?: string
913
usedFsRead?: boolean
@@ -18,21 +22,27 @@ export type RequestContext = {
1822
* Promise that need to be executed even if response was already sent
1923
*/
2024
backgroundWorkPromise: Promise<unknown>
25+
logger: SystemLogger
2126
}
2227

2328
type RequestContextAsyncLocalStorage = AsyncLocalStorage<RequestContext>
2429

25-
export function createRequestContext(debug = false): RequestContext {
30+
export function createRequestContext(request?: Request): RequestContext {
2631
const backgroundWorkPromises: Promise<unknown>[] = []
2732

2833
return {
29-
debug,
34+
captureServerTiming: request?.headers.has('x-next-debug-logging') ?? false,
3035
trackBackgroundWork: (promise) => {
3136
backgroundWorkPromises.push(promise)
3237
},
3338
get backgroundWorkPromise() {
3439
return Promise.allSettled(backgroundWorkPromises)
3540
},
41+
logger: systemLogger.withLogLevel(
42+
request?.headers.has('x-nf-debug-logging') || request?.headers.has('x-next-debug-logging')
43+
? LogLevel.Debug
44+
: LogLevel.Log,
45+
),
3646
}
3747
}
3848

@@ -66,3 +76,7 @@ export const getRequestContext = () => getRequestContextAsyncLocalStorage().getS
6676
export function runWithRequestContext<T>(requestContext: RequestContext, fn: () => T): T {
6777
return getRequestContextAsyncLocalStorage().run(requestContext, fn)
6878
}
79+
80+
export function getLogger(): SystemLogger {
81+
return getRequestContext()?.logger ?? systemLogger
82+
}

‎src/run/handlers/server.ts

+2-3
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,8 @@ import {
1414
setVaryHeaders,
1515
} from '../headers.js'
1616
import { nextResponseProxy } from '../revalidate.js'
17-
import { logger } from '../systemlog.cjs'
1817

19-
import { createRequestContext, getRequestContext } from './request-context.cjs'
18+
import { createRequestContext, getLogger, getRequestContext } from './request-context.cjs'
2019
import { getTracer } from './tracer.cjs'
2120

2221
const nextImportPromise = import('../next.cjs')
@@ -107,7 +106,7 @@ export default async (request: Request, context: FutureContext) => {
107106

108107
// We don't await this here, because it won't resolve until the response is finished.
109108
const nextHandlerPromise = nextHandler(req, resProxy).catch((error) => {
110-
logger.withError(error).error('next handler error')
109+
getLogger().withError(error).error('next handler error')
111110
console.error(error)
112111
resProxy.statusCode = 500
113112
span.setAttribute('http.status_code', 500)

‎src/run/handlers/tracer.cts

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ function spanHook(span: Span): Span {
1818
const meta = spanMeta.get(span)
1919
if (meta) {
2020
const requestContext = getRequestContext()
21-
if (requestContext?.debug) {
21+
if (requestContext?.captureServerTiming) {
2222
const duration = (typeof endTime === 'number' ? endTime : performance.now()) - meta.start
2323

2424
const serverTiming = requestContext.serverTiming ?? ''

‎src/run/handlers/tracing.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {
77
SEMRESATTRS_SERVICE_VERSION,
88
} from '@opentelemetry/semantic-conventions'
99

10-
import { logger } from '../systemlog.cjs'
10+
import { getLogger } from './request-context.cjs'
1111

1212
const {
1313
default: { version, name },
@@ -33,7 +33,8 @@ process.on('SIGTERM', () => {
3333
.then(
3434
// eslint-disable-next-line @typescript-eslint/no-empty-function
3535
() => {},
36-
(error: unknown) => logger.withError(error).log('Error shutting down OpenTelemetry NodeSDK'),
36+
(error: unknown) =>
37+
getLogger().withError(error).log('Error shutting down OpenTelemetry NodeSDK'),
3738
)
3839
// eslint-disable-next-line n/no-process-exit
3940
.finally(() => process.exit(0))

‎src/run/systemlog.cts

-1
This file was deleted.

0 commit comments

Comments
 (0)
Please sign in to comment.