β‘ 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 happenedControlling 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.jsworkers
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
Errorinstance is sent, the error object will be accessible with theerrorproperty on the context, this is for bothfatalanderror.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
