Adapted from purescript-logging
logging-ts version |
required fp-ts version |
required TypeScript version |
---|---|---|
0.3.0 | 2.0.0+ | 3.5+ |
0.2.0 | 1.7.0+ | 2.8.0+ |
From purescript-logging
's README
A logger receives records and potentially performs some effects. You can create a logger from any function
(a: A) => HKT<M, void>
for anyA
andM
.Unlike most other logging libraries,
logging-ts
has no separate concepts "loggers" and "handlers". Instead, loggers can be composed into larger loggers using theSemigroup
instance. Loggers can also be transformed usingcontramap
(for transforming records) andfilter
(for filtering records). An example use case might be the following:
import * as C from 'fp-ts/lib/Console'
import * as D from 'fp-ts/lib/Date'
import { chain, IO } from 'fp-ts/lib/IO'
import { pipe } from 'fp-ts/lib/pipeable'
import * as L from '../src/IO'
type Level = 'Debug' | 'Info' | 'Warning' | 'Error'
interface Entry {
message: string
time: Date
level: Level
}
function showEntry(entry: Entry): string {
return `[${entry.level}] ${entry.time.toLocaleString()} ${entry.message}`
}
function getLoggerEntry(prefix: string): L.LoggerIO<Entry> {
return entry => C.log(`${prefix}: ${showEntry(entry)}`)
}
const debugLogger = L.filter(getLoggerEntry('debug.log'), e => e.level === 'Debug')
const productionLogger = L.filter(getLoggerEntry('production.log'), e => e.level !== 'Debug')
const logger = L.getMonoid<Entry>().concat(debugLogger, productionLogger)
const info = (message: string) => (time: Date): IO<void> => logger({ message, time, level: 'Info' })
const debug = (message: string) => (time: Date): IO<void> => logger({ message, time, level: 'Debug' })
const program = pipe(
D.create,
chain(info('boot')),
chain(() => D.create),
chain(debug('Hello!'))
)
program()
/*
production.log: [Info] 10/4/2019, 12:44:48 PM boot
debug.log: [Debug] 10/4/2019, 12:44:48 PM Hello!
*/