@8select/strulo
Version:
Log messages in a structured format.
65 lines (56 loc) • 1.55 kB
Flow
// @flow
import createLogger from 'debug'
import { getLevelName, logLevels } from './log-levels'
import { formatMessage } from './message'
import type { LogLevel } from './log-levels'
import type { Message } from './message'
const logFunctions = Object.keys(logLevels).reduce(buildLogFunctionPerLogLevel, {})
export const debug = (message: Message): void => {
logFunctions.debug(message)
}
export const info = (message: Message): void => {
logFunctions.info(message)
}
export const notice = (message: Message): void => {
logFunctions.notice(message)
}
export const warning = (message: Message): void => {
logFunctions.warning(message)
}
export const error = (message: Message): void => {
logFunctions.error(message)
}
export const critical = (message: Message): void => {
logFunctions.critical(message)
}
export const alert = (message: Message): void => {
logFunctions.alert(message)
}
export const emergency = (message: Message): void => {
logFunctions.emergency(message)
}
function buildLogFunctionPerLogLevel(previousObjectWithLogFunctions: Object, currentLogLevel: LogLevel) {
return Object.assign(
previousObjectWithLogFunctions,
{},
{
[getLevelName(currentLogLevel).toLowerCase()]: log(currentLogLevel),
}
)
}
function log(level: LogLevel): Function {
const logger = createLogger(getLevelName(level))
return function(message: Message): void {
logger(formatMessage(level, message))
}
}
export default {
debug,
info,
notice,
warning,
error,
critical,
alert,
emergency,
}