Logger
lightweight logger base on the concept of transports and formatters.
Transports - logs destination (console, s3 etc...)
Formatters - mappers function before logs moved to the transport
logging methods
method | weight | color | enum |
---|
silent | 0 | - | SILENT |
error | 2 | red | ERROR |
warn | 4 | yellow | WARN |
info/log/beatify | 6 | white | INFO |
debug | 8 | magenta | DEBUG |
Usage
when creating an instance of logger u need to pass at least one transporter and 0+ formatters
each log will pass through.
each transporter can receive many formatter that will be invoke after all the logger formatters ended.
import { Logger, ConsoleTransport, formatters, LogLevel, addLogLevel, Color } from '@logzio-node-toolbox/logger';
const logFormatter = formatters.logSize();
const transportFormatter = formatters.omitFields(['name']);
const consoleTransport1 = new ConsoleTransport({name: 'console-1', formatters: [transportFormatter] });
const consoleTransport2 = new ConsoleTransport({name: 'console-2'});
const logger = new Logger({
formatters: [logFormatter],
transports: [consoleTransport1, consoleTransport2],
metaData: { globalMetaData: 'globalMetaData' }
});
logger.info('hello', { name: 'from', last: 'last' });
logger.removeTransport('console-1');
logger.info('hello', { name: 'name', message: 'override' });
logger.info('hello', { name: 'from' }, {last: 'last'});
logger.info('hello', { name: 'from' }, [1,2,3]);
logger.info({ name: 'from', last: 'last' });
logger.logLevel(LogLevel.DEBUG)
addLogLevel({name: 'RANDOM', color: Color.black, weight})
await logger.close()
Transports
ConsoleTransport
log to console
- params
- name - string (default console)
- formatters - array | list of formatters
- logLevel - string (default info) | representing the log level to log
- color - boolean (default true) | adding color to output
import { Logger, ConsoleTransport } from '@logzio-node-toolbox/logger';
const consoleTransport = new ConsoleTransport({ name: 'logzioTransport', formatters: [transportFormatter], token:'123', meta: {region: 'prod', } });
LogzioTransport
send the log to logzio with the given token
- params
- name - string (default logzio)
- host - string
- token - string
- type - string (default node-js)
- metaData - object | default data to add to each log
- formatters - array | list of formatters
- logLevel - string (default info) | representing the log level to log
- moreOptions - object (default true) | options to pass to logzio-nodejs
import { Logger, LogzioTransport } from '@logzio-node-toolbox/logger';
const logzioTransport = new LogzioTransport({ name: 'new-console', formatters: [transportFormatter] });
custom Transport
creating a custom Transport
- functions:
- logLevel - change log level
- close - stop receiving logs
- open - start receiving logs
import { Logger, Transport, formatters } from '@logzio-node-toolbox/logger';
class CustomTransports extend Transport {
constructor(name, formatters, logLevel, ...paramsUNeed) {
super({ name, formatters, logLevel })
}
logLevel(data) {
}
close()
}
const customTransports = new CustomTransports({name: 'myCustomTransports', formatters: [formatters.logSize(100)] })
const logger = new Logger({transports: [ customTransports ] })
logger.info('hello')
customTransports.loLevel('DEBUG')
logger.debug('hello')
Formatters
omitFields
Array of fields by path string tp remove from the log.
import { Logger, formatters } from '@logzio-node-toolbox/logger';
const formatter = formatters.omitFields(['path.to.omit', 'path.to.omit2']);
const logger = new Logger({ formatters: [formatter] });
logger.log({
path: {
to :{
omit: 'should omit',
omit2: 'also should omit',
omit3: 'should not omit'
}
}
})
handleError
- look for err || error || message. err fields make sure they are objects.
- serialize the error and make sure logLevel is error.
import { Logger, formatters } from '@logzio-node-toolbox/logger';
const formatter = formatters.handleError();
const logger = new Logger({ formatters: [formatter] });
const err = new Error('random error');
logger.log({
err
})
logSize
- add logSize field to the log.
- validate max log size with value pass in bytes.
import { Logger, formatters } from '@logzio-node-toolbox/logger';
const formatter = formatters.logSize(100);
const logger = new Logger({ formatters: [formatter] });
logger.log('message with log size', { field: 'random' });
const formatter = formatters.logSize(30);
const logger = new Logger({ formatters: [formatter] });
logger.log('message with log size', { field: 'random' });
maskFields
mask fields by the length was received with *
- params:
- list - {{ field: string, length?: number }}
- length - number (default 7)
import { Logger, formatters } from '@logzio-node-toolbox/logger';
const formatter = formatters.maskFields([{ field: 'password', length: 6 }], 10);
const logger = new Logger({ formatters: [formatter] });
logger.log({
field: 'random',
password: '12345678',
ip: '123.123.123.123',
});
pickFields
will omit all object property except the given array
- params
- name - string
- list - array of strings
- shouldFlat - will flat the omit fields to the root of the log | default true
import { Logger, formatters } from '@logzio-node-toolbox/logger';
const formatter = formatters.pickFields('req', ['port', 'host'], true);
const logger = new Logger({ formatters: [formatter] });
logger.info("incoming" ,{ req: { port: '3000', host: 'localhost', ip: "127.0.0.1" }});
const formatter = formatters.pickFields('req', ['port', 'host'], false);
const logger = new Logger({ formatters: [formatter] });
logger.info("incoming" ,{ req: { port: '3000', host: 'localhost', ip: "127.0.0.1" }});
removeCircularFields
iterate over the log and remove all circular fields
import { Logger, formatters } from '@logzio-node-toolbox/logger';
const formatter = formatters.removeCircularFields();
const logger = new Logger({ formatters: [formatter] });
const a = { name : 'name'};
a.b = a;
logger.info(a);
renameFields
rename fields from to path to path
import { Logger, formatters } from '@logzio-node-toolbox/logger';
const formatter = formatters.renameFields({ 'path.to.field.rename': 'name.to.field.newName' });
const logger = new Logger({ formatters: [formatter] });
logger.info({ path: { to : {field : { rename: "some value"}}}});
sliceFields
- params
- list - array of paths to slice (if field is object will stringify it before slice)
- size - size to slice
import { Logger, formatters } from '@logzio-node-toolbox/logger';
const formatter = formatters.sliceFields(['path.to.slice'], 10);
const logger = new Logger({ formatters: [formatter] });
logger.info({ path: { to : { slice : { "some value to slice if its to long" }}}});
logger.info({ path: { to : { slice : { field1: 'first filed to slice', field2: "second filed to slice" }}}});