Add logger to base analytics context

This commit is contained in:
Eric Bailey
2026-01-21 11:34:58 -06:00
parent 71c6771e87
commit 3bc772a12a
2 changed files with 44 additions and 2 deletions
+34
View File
@@ -1,6 +1,7 @@
import {createContext, useContext, useEffect, useMemo} from 'react' import {createContext, useContext, useEffect, useMemo} from 'react'
import {Platform} from 'react-native' import {Platform} from 'react-native'
import {Logger} from '#/logger'
import { import {
Features, Features,
features as feats, features as feats,
@@ -24,8 +25,21 @@ import {device} from '#/storage'
export * as utils from '#/analytics/utils' export * as utils from '#/analytics/utils'
export const features = {init, refresh} 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<Logger['context'], undefined>) => LoggerType
Context: typeof Logger.Context
}
type AnalyticsContextType = { type AnalyticsContextType = {
metadata: Metadata metadata: Metadata
logger: LoggerType
metric: <E extends keyof Metrics>( metric: <E extends keyof Metrics>(
event: E, event: E,
payload: Metrics[E], payload: Metrics[E],
@@ -39,7 +53,26 @@ type AnalyticsBaseContextType = Omit<
'feature' | 'Features' 'feature' | 'Features'
> >
function createLogger(
context: Logger['context'],
metadata: Partial<Metadata>,
): 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<Logger['context'], undefined>) => {
return useMemo(() => createLogger(context, metadata), [context, metadata])
},
Context: Logger.Context,
}
}
const Context = createContext<AnalyticsBaseContextType>({ const Context = createContext<AnalyticsBaseContextType>({
logger: createLogger(Logger.Context.Default, {}),
metric: (event, payload, metadata) => { metric: (event, payload, metadata) => {
metrics.track(event, payload, metadata) metrics.track(event, payload, metadata)
}, },
@@ -98,6 +131,7 @@ export function AnalyticsContext({
combinedMetadata.base.sessionId = sessionId combinedMetadata.base.sessionId = sessionId
combinedMetadata.geolocation = geolocation combinedMetadata.geolocation = geolocation
const context: AnalyticsBaseContextType = { const context: AnalyticsBaseContextType = {
logger: createLogger(Logger.Context.Default, combinedMetadata),
metadata: combinedMetadata, metadata: combinedMetadata,
metric: (event, payload, extraMetadata) => { metric: (event, payload, extraMetadata) => {
parentContext.metric(event, payload, { parentContext.metric(event, payload, {
+10 -2
View File
@@ -35,15 +35,17 @@ export class Logger {
level: LogLevel level: LogLevel
context: LogContext | undefined = undefined context: LogContext | undefined = undefined
contextFilter: string = '' contextFilter: string = ''
inheritedMetadata: Record<string, unknown> = {}
protected debugContextRegexes: RegExp[] = [] protected debugContextRegexes: RegExp[] = []
protected transports: Transport[] = [] protected transports: Transport[] = []
static create(context?: LogContext) { static create(context?: LogContext, metadata: Record<string, unknown> = {}) {
const logger = new Logger({ const logger = new Logger({
level: process.env.EXPO_PUBLIC_LOG_LEVEL as LogLevel, level: process.env.EXPO_PUBLIC_LOG_LEVEL as LogLevel,
context, context,
contextFilter: process.env.EXPO_PUBLIC_LOG_DEBUG || '', contextFilter: process.env.EXPO_PUBLIC_LOG_DEBUG || '',
metadata,
}) })
for (const transport of TRANSPORTS) { for (const transport of TRANSPORTS) {
logger.addTransport(transport) logger.addTransport(transport)
@@ -55,14 +57,17 @@ export class Logger {
level, level,
context, context,
contextFilter, contextFilter,
metadata: inheritedMetadata = {},
}: { }: {
level?: LogLevel level?: LogLevel
context?: LogContext context?: LogContext
contextFilter?: string contextFilter?: string
metadata?: Record<string, unknown>
} = {}) { } = {}) {
this.context = context this.context = context
this.level = level || LogLevel.Info this.level = level || LogLevel.Info
this.contextFilter = contextFilter || '' this.contextFilter = contextFilter || ''
this.inheritedMetadata = inheritedMetadata
if (this.contextFilter) { if (this.contextFilter) {
this.level = LogLevel.Debug this.level = LogLevel.Debug
} }
@@ -133,7 +138,10 @@ export class Logger {
return return
const timestamp = Date.now() const timestamp = Date.now()
const meta = metadata || {} const meta: Metadata = {
...metadata,
inherited: this.inheritedMetadata,
}
// send every log to syslog // send every log to syslog
add({ add({