Skip to content

Commit

Permalink
feat(addHandler): Allow log event filters to be specified
Browse files Browse the repository at this point in the history
BREAKING CHANGE: Handler funtion is no longer optional for either `addHandler` or `removeHandler`. Used to default to `defaultHandler`.
  • Loading branch information
nokome committed Nov 21, 2019
1 parent 322c7d1 commit 0f467b4
Show file tree
Hide file tree
Showing 2 changed files with 99 additions and 11 deletions.
62 changes: 62 additions & 0 deletions index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,68 @@ test('adding and removing handlers', () => {
expect(consoleError.mock.calls.length).toBe(consoleErrorCalls)
})

test('adding a handler with filter options', () => {
const log1 = getLogger('log1')
const log2 = getLogger('log2')
removeHandlers()

let lastMessage
const recordMessage = (logData: LogData) => (lastMessage = logData.message)

// No filter
const handler1 = addHandler(recordMessage)
log1.debug('A')
expect(lastMessage).toBe('A')
removeHandler(handler1)

// tags filter
const handler2 = addHandler(recordMessage, { tags: ['log1'] })
log1.debug('B')
log2.debug('C')
expect(lastMessage).toBe('B')
removeHandler(handler2)

// maxLevel filter
const handler3 = addHandler(recordMessage, { maxLevel: LogLevel.error })
log1.error('D')
log1.debug('E')
expect(lastMessage).toBe('D')
removeHandler(handler3)

// messageRegex filter
const handler4 = addHandler(recordMessage, { messageRegex: /^F$/ })
log1.debug('F')
log1.debug('f')
log1.debug('')
log1.debug(' FF')
expect(lastMessage).toBe('F')
removeHandler(handler4)

// func filter
const handler5 = addHandler(recordMessage, {
func: (logData: LogData): boolean =>
logData.level === LogLevel.debug && logData.message.startsWith('G')
})
log1.debug('G')
log1.debug('g')
log1.error('Goof')
expect(lastMessage).toBe('G')
removeHandler(handler5)

// All the filters together
const handler6 = addHandler(recordMessage, {
tags: ['log2'],
maxLevel: LogLevel.warn,
messageRegex: /^H/,
func: (logData: LogData): boolean => logData.message.endsWith('!')
})
log2.warn('Hello world!')
log2.debug('Help!')
log1.error('Hello woof!')
expect(lastMessage).toBe('Hello world!')
removeHandler(handler6)
})

test('defaultHandler:level', () => {
const log = getLogger('logger')

Expand Down
48 changes: 37 additions & 11 deletions index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -148,25 +148,51 @@ export function handlers(): LogHandler[] {
/**
* Add a handler.
*
* @param handler A function that handles the log data. Defaults to `defaultHandler`.
* @param handler A function that handles the log data.
* @param filter Options for filtering log data prior to sending to the handler.
* @param filter.tags A list of tags that the log data should match.
* @param filter.maxLevel The maximum log level.
* @param filter.messageRegex A regex that the log level should match.
* @param filter.func A function that determines if handler is called
* @returns The handler function that was added.
*/
export function addHandler(handler?: LogHandler): LogHandler {
if (handler === undefined) handler = defaultHandler
bus.addListener(LOG_EVENT_NAME, handler)
return handler
export function addHandler(
handler: LogHandler,
filter: {
tags?: string[]
maxLevel?: LogLevel
messageRegex?: RegExp
func?: (logData: LogData) => boolean
} = {}
): LogHandler {
let listener = handler
const { tags, maxLevel, messageRegex, func } = filter
if (
tags !== undefined ||
maxLevel !== undefined ||
messageRegex !== undefined ||
func !== undefined
) {
listener = (logData: LogData) => {
if (tags !== undefined && !tags.includes(logData.tag)) return
if (maxLevel !== undefined && logData.level > maxLevel) return
if (messageRegex !== undefined && !messageRegex.test(logData.message))
return
if (func !== undefined && !func(logData)) return
handler(logData)
}
}
bus.addListener(LOG_EVENT_NAME, listener)
return listener
}

/**
* Remove a handler.
*
* @param handler The handler function to remove. Defaults to `defaultHandler`.
* @param handler The handler function to remove.
*/
export function removeHandler(handler?: LogHandler): void {
bus.removeListener(
LOG_EVENT_NAME,
handler !== undefined ? handler : defaultHandler
)
export function removeHandler(handler: LogHandler): void {
bus.removeListener(LOG_EVENT_NAME, handler)
}

/**
Expand Down

0 comments on commit 0f467b4

Please sign in to comment.