diff --git a/example/example.js b/example/example.js index 8764e49..3e3f6a0 100644 --- a/example/example.js +++ b/example/example.js @@ -7,23 +7,24 @@ class LogTest { // pretty: {translateTime:true, colorize:true, levelFirst:true } // options for pino pretty printer // env:'', // 'dev' or 'pro' -- can be use to set/override UCI_ENV environment variable // enForce: false, // only used with .evn. if true will override UCI_ENV if it is set, otherwise no - // level:'info', // info is default level, set level to lowest visible + // level:'debug', // info is default level, set level to lowest visible // clear: false, // true for log files will clear the current log file on restart // logFileName:'test', // if not supplied log filename will be generated from timestamp - // below properties are optional and are passed to child logger instance and will be part of json log entry + // below are BASE properties which are optional and are passed to child logger instance and will be part of json log entry // libraryName: 'UCI', // will be logged as name: can be used to identify logs of related packages, can be set via UCI_LOG_NAME env variable appName:'uci-example-logger', //will be used for logging directory name if supplied and will be logged as well - package: '@uci/logger', // name of package with scope per package.json + package: '@uci/test', // name of package with scope per package.json // repo: // will use scope-name from package prop if not supplied id: opts.id, // can pass a unique if for easy later search/filtering // file: 'example/example.js', // path (to repo root) of actual file running this logger, default is ./src/.js - class: 'LogTest', // The class that created this logger if any - // one can pass through additional props to log for every log - // should not use any keys above or - // level,time,msg,pid,hostname - // logPath,instanceCreatedHR,instanceCreated as keys will be merged - // NOTE: more props can be added at run time by passing an object of props - additional: {anotherprop:'test'} // should do not use any keys above or 'level,logPath,package,instanceCreatedHR,instanceCreated' as keys will be merged + // class: 'LogTest', // The class that created this logger if any + + /*---------------- + Can pass through additional props for every log by including this `additional` property object + should not use any keys above or level,time,msg,pid,hostname, + logPath,instanceCreatedHR,instanceCreated as keys in this object will be merged + ------------------*/ + // additional: {anotherprop:'test'} }) } @@ -34,11 +35,17 @@ class LogTest { log.warn('this is a warn level logged message') log.error('this is a error level logged message') log.fatal('this is a fatal level logged message') - log.clear('This would clear the log') } - } let test = new LogTest({id:'logtest-via-new'}) +log.div(`the default log level based on option or UCI_LOG_LEVEL ${log.default}`) test.logit() +log.lvlset('fatal') +log.div(`now changing log level manually in code to ${log.level}`) +test.logit() +log.div(`reset level back current default ${log.default}`) +log.lvlset() +test.logit() +log.clear('This call to log.clear could clear the file log when implemented') diff --git a/readme.md b/readme.md index cc94c29..426edae 100644 --- a/readme.md +++ b/readme.md @@ -1,6 +1,6 @@ -`# uCOMmandIt JSON Logger +# uCOMmandIt JSON Logger -### json logger based on pino. +### json logger based on [pino](getpino.io). ## How to by Example diff --git a/src/logger.js b/src/logger.js index 1bdc05d..8d748b1 100644 --- a/src/logger.js +++ b/src/logger.js @@ -5,32 +5,31 @@ import { dirname, basename } from 'path' function child (opts) { - if (opts.env) (opts.envForce) ? (process.env.UCI_ENV = opts.env) : (process.env.UCI_ENV = process.env.UCI_ENV || opts.env) + const enabled = !!process.env.UCI_ENV - if (process.env.UCI_ENV === 'node') process.env.UCI_ENV = process.env.NODE_ENV + let pretty = false; let LOG_PATH; let DATE_TIME - let pretty = false - if(process.env.UCI_ENV === 'dev' || process.env.UCI_ENV === 'development') { - if (process.env.UCI_LOG_JSON !=='true') { - pretty = process.env.UCI_LOG_PRETTY || opts.pretty || {translateTime:true, colorize:true, levelFirst:true } - pretty.search = process.env.UCI_LOG_SEARCH + if (enabled) { + if (opts.env) (opts.envForce) ? (process.env.UCI_ENV = opts.env) : (process.env.UCI_ENV = process.env.UCI_ENV || opts.env) + if (process.env.UCI_ENV === 'node') process.env.UCI_ENV = process.env.NODE_ENV + if(process.env.UCI_ENV.indexOf('dev')>-1) { + if (process.env.UCI_LOG_JSON !=='true') { + pretty = process.env.UCI_LOG_PRETTY || opts.pretty || {translateTime:true, colorize:true, levelFirst:true } + pretty.search = process.env.UCI_LOG_SEARCH + } + } + DATE_TIME = new Date(Date.now()).toISOString().replace( /[:.]+/g, '-' ) + LOG_PATH = ( process.env.UCI_ENV.indexOf('pro') > -1 || process.env.UCI_ENV === 'logfile' ) + ? ( process.env.UCI_LOG_PATH || `${envPaths(opts.appName || opts.name || 'default').log}/${opts.logFileName || DATE_TIME}.log`) : undefined + if (LOG_PATH) { + try { mkdir(dirname(LOG_PATH)) } + catch(err) { throw err } } } - - const DATE_TIME = new Date(Date.now()).toISOString().replace( /[:.]+/g, '-' ) - - const LOG_PATH = (process.env.UCI_ENV=== 'production' || process.env.UCI_ENV=== 'pro' || process.env.UCI_ENV=== 'logfile' ) - ? ( process.env.UCI_LOG_PATH || `${envPaths(opts.appName || opts.name || 'default').log}/${opts.logFileName || DATE_TIME}.log`) : null - - if (LOG_PATH) { - try { mkdir(dirname(LOG_PATH)) } - catch(err) { throw err } - } - // console.log('making logger (env,json,pretty,pretty-search,path)',process.env.UCI_ENV,process.env.UCI_LOG_JSON,pretty,process.env.UCI_LOG_SEARCH,LOG_PATH) const logger = pino({ name: opts.libraryName || process.env.UCI_LOG_NAME || 'UCI', - enabled: !!process.env.UCI_ENV, + enabled: enabled, safe: true, serializers: { req: pino.stdSerializers.req, @@ -42,16 +41,14 @@ function child (opts) { LOG_PATH ) - logger.clear = value => {console.log(value)} - let logOpts = { - level:opts.level, + level:opts.level || process.env.UCI_LOG_LEVEL, logPath: LOG_PATH, // if logging to file appName: opts.appName, - repo: opts.repo || (opts.package) ? opts.package.replace( /[@]+/g, '' ).replace( /[/]+/g, '-' ) : null, + repo: opts.repo || (opts.package) ? opts.package.replace( /[@]+/g, '' ).replace( /[/]+/g, '-' ) : undefined, package: opts.package, - file: opts.file || `src/${basename(opts.package)}.js`, - class: opts.class || (opts.name.charAt(0).toUpperCase() + opts.name.slice(1)), + file: opts.file || (opts.package) ? `src/${basename(opts.package)}.js` : undefined, + class: opts.class || (opts.package) ? (basename(opts.package).charAt(0).toUpperCase() + opts.package.slice(1)) : undefined, id: opts.id || opts.name || 'none', instanceCreatedHR:DATE_TIME, instanceCreated:new Date().getTime() @@ -59,7 +56,20 @@ function child (opts) { logOpts = Object.assign(logOpts,opts.additional) - return logger.child(logOpts) + let child = logger.child(logOpts) + + child.default = opts.level || process.env.UCI_LOG_LEVEL + child.clear = () => { + if (enabled) { + if (process.env.UCI_ENV.indexOf('pro') > -1) return null } // enable feature here + } + child.div = value => { + if (enabled) { + if (process.env.UCI_ENV.indexOf('dev') > -1) console.log(`===== ${value} ========`)} + } + child.lvlset = (level) => { if (enabled) child.level = level || child.default || 'info' } + + return child } export default child