Add logger to base analytics context
This commit is contained in:
@@ -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
@@ -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({
|
||||||
|
|||||||
Reference in New Issue
Block a user