From 3bc772a12a1edb4c3c2dab92e10d0e67e0eb3850 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Wed, 21 Jan 2026 11:34:58 -0600 Subject: [PATCH] Add logger to base analytics context --- src/analytics/index.tsx | 34 ++++++++++++++++++++++++++++++++++ src/logger/index.tsx | 12 ++++++++++-- 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/src/analytics/index.tsx b/src/analytics/index.tsx index 95dd33705b..8e0a9aeff2 100644 --- a/src/analytics/index.tsx +++ b/src/analytics/index.tsx @@ -1,6 +1,7 @@ import {createContext, useContext, useEffect, useMemo} from 'react' import {Platform} from 'react-native' +import {Logger} from '#/logger' import { Features, features as feats, @@ -24,8 +25,21 @@ import {device} from '#/storage' export * as utils from '#/analytics/utils' export const features = {init, refresh} +type LoggerType = { + debug: Logger['debug'] + info: Logger['info'] + log: Logger['log'] + warn: Logger['warn'] + error: Logger['error'] + /** + * Creates a clone of the existing logger and overrides the `context` value + */ + useContext: (context: Exclude) => LoggerType + Context: typeof Logger.Context +} type AnalyticsContextType = { metadata: Metadata + logger: LoggerType metric: ( event: E, payload: Metrics[E], @@ -39,7 +53,26 @@ type AnalyticsBaseContextType = Omit< 'feature' | 'Features' > +function createLogger( + context: Logger['context'], + metadata: Partial, +): LoggerType { + const logger = Logger.create(context, metadata) + return { + debug: logger.debug.bind(logger), + info: logger.info.bind(logger), + log: logger.log.bind(logger), + warn: logger.warn.bind(logger), + error: logger.error.bind(logger), + useContext: (context: Exclude) => { + return useMemo(() => createLogger(context, metadata), [context, metadata]) + }, + Context: Logger.Context, + } +} + const Context = createContext({ + logger: createLogger(Logger.Context.Default, {}), metric: (event, payload, metadata) => { metrics.track(event, payload, metadata) }, @@ -98,6 +131,7 @@ export function AnalyticsContext({ combinedMetadata.base.sessionId = sessionId combinedMetadata.geolocation = geolocation const context: AnalyticsBaseContextType = { + logger: createLogger(Logger.Context.Default, combinedMetadata), metadata: combinedMetadata, metric: (event, payload, extraMetadata) => { parentContext.metric(event, payload, { diff --git a/src/logger/index.tsx b/src/logger/index.tsx index 0209c34271..83666b17bb 100644 --- a/src/logger/index.tsx +++ b/src/logger/index.tsx @@ -35,15 +35,17 @@ export class Logger { level: LogLevel context: LogContext | undefined = undefined contextFilter: string = '' + inheritedMetadata: Record = {} protected debugContextRegexes: RegExp[] = [] protected transports: Transport[] = [] - static create(context?: LogContext) { + static create(context?: LogContext, metadata: Record = {}) { const logger = new Logger({ level: process.env.EXPO_PUBLIC_LOG_LEVEL as LogLevel, context, contextFilter: process.env.EXPO_PUBLIC_LOG_DEBUG || '', + metadata, }) for (const transport of TRANSPORTS) { logger.addTransport(transport) @@ -55,14 +57,17 @@ export class Logger { level, context, contextFilter, + metadata: inheritedMetadata = {}, }: { level?: LogLevel context?: LogContext contextFilter?: string + metadata?: Record } = {}) { this.context = context this.level = level || LogLevel.Info this.contextFilter = contextFilter || '' + this.inheritedMetadata = inheritedMetadata if (this.contextFilter) { this.level = LogLevel.Debug } @@ -133,7 +138,10 @@ export class Logger { return const timestamp = Date.now() - const meta = metadata || {} + const meta: Metadata = { + ...metadata, + inherited: this.inheritedMetadata, + } // send every log to syslog add({