β‘ Features
- No dependencies
- Outstanding performance
- Support for
debug
βs filter - Browser compatible through
localStorage
βοΈ Install
npm add diary
π Usage
import { info, diary } from 'diary';
info('this important thing happened');
// ~> βΉ info this important thing happened
const scopedDiary = diary('my-module', (event) => {
if (event.level === 'error') {
Sentry.captureException(event.error);
}
});
scopedDiary.info('this other important thing happened');
// ~> βΉ info [my-module] this other important thing happened
Controlling runtime emission of logs, using the code below as an example:
// example.js
import { diary } from 'diary';
const scopeA1 = diary('scopeA:one');
const scopeA2 = diary('scopeA:two');
const scopeB1 = diary('scopeB:one');
const scopeB2 = diary('scopeB:two');
scopeA1.info('message'); // won't log β
scopeA2.info('message'); // will log β
scopeB1.info('message'); // will log β
scopeB2.info('message'); // will log β
browser
localStorage.setItem('DEBUG', 'scopeA:two,scopeB:*');
// then your scripts
π‘ Tip - Set this via the DevTools, then hit refresh. Saves you having to re-bundle.
node
DEBUG=scopeA:two,scopeB:* node example.js
workers
Create an Environment Variable with DEBUG
.
β οΈ Specifically referencing the Cloudflare Workers
programmatic
import { diary, enable } from 'diary';
enable('scopeA:two,scopeB:*');
const scopeA1 = diary('scopeA:one');
const scopeA2 = diary('scopeA:two');
const scopeB1 = diary('scopeB:one');
const scopeB2 = diary('scopeB:two');
scopeA1.info('message'); // won't log β
scopeA2.info('message'); // will log β
scopeB1.info('message'); // will log β
scopeB2.info('message'); // will log β
enable('scopeA:*');
scopeA1.info('message'); // will log β
scopeA2.info('message'); // will log β
scopeB1.info('message'); // won't log β
scopeB2.info('message'); // won't log β
π API
diary(name: string, onEmit?: Reporter)
Returns: log functions
A default diary is exported, accessible through simply importing any log function.
Example of default diary
import { info } from 'diary'; info("i'll be logged under the default diary");
name
Type: string
The name given to this diaryβand will also be available in all logEvents.
onEmit (optional)
Type: Reporter
A reporter is run on every log message (provided its enabled). A reporter gets given the
LogEvent
interface:
interface LogEvent {
name: string;
level: LogLevels;
message: string;
extra: unknown[];
}
Errors (for error
and fatal
) there is also an error: Error
property.
log functions
A set of functions that map to console.error
, console.warn
, console.debug
, console.info
and console.info
.
Aptly named;
fatal(message: string | Error, ...extra: any[])
error(message: string | Error, ...extra: any[])
If an
Error
instance is sent, the error object will be accessible with theerror
property on the context, this is for bothfatal
anderror
.warn(message: string, ...extra: any[])
debug(message: string, ...extra: any[])
info(message: string, ...extra: any[])
log(message: string, ...extra: any[])
All extra
parameters are simply spread onto the console function, so node/browserβs built-in formatters will format
any objects etc.
diary (optional)
Type: Diary
The result of a calling diary;
enable(query: string)
Type: Function
Opts certain log messages into being output. See more here.
π¨ Benchmark
Validation
β @graphile/logger
β bunyan
β debug
β diary
β pino
β roarr
β ulog
β winston
Benchmark
@graphile/logger x 21,801,529 ops/sec Β±0.88% (93 runs sampled)
bunyan x 109,073 ops/sec Β±0.71% (94 runs sampled)
debug x 228,734 ops/sec Β±1.28% (88 runs sampled)
diary x 6,962,434 ops/sec Β±0.50% (93 runs sampled)
pino x 48,998 ops/sec Β±0.93% (91 runs sampled)
roarr x 927,402 ops/sec Β±0.64% (94 runs sampled)
ulog x 25,681 ops/sec Β±27.59% (17 runs sampled)
winston x 12,314 ops/sec Β±5.01% (83 runs sampled)
Ran with Node v16.2.0
License
MIT Β© Marais Rossouw