import pino from 'pino' import envPaths from 'env-paths' import { sync as mkdir } from 'make-dir' import { dirname, basename } from 'path' function child (opts) { const enabled = !!process.env.UCI_ENV let pretty = false; let LOG_PATH; let DATE_TIME const PRETTY_DEFAULTS = {translateTime:true, colorize:true, levelFirst:true } let logOpts = { level:opts.level || process.env.UCI_LOG_LEVEL, logPath: LOG_PATH, // if logging to file appName: opts.appName || opts.name, package: opts.package, repo: opts.repo || ((typeof opts.package==='string') ? opts.package.replace( /[@]+/g, '' ).replace( /[/]+/g, '-' ) : undefined), file: opts.file || ((typeof opts.package==='string') ? `src/${basename(opts.package)}.js` : undefined), class: opts.class || ( (typeof opts.package==='string') ? capitalize(basename(opts.package)) : undefined), id: opts.id || opts.name || 'none', instanceCreatedHR:DATE_TIME, instanceCreated:Date.now() } logOpts = Object.assign(logOpts,opts.additional) 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') { if (process.env.UCI_LOG_PRETTY && process.env.UCI_LOG_PRETTY !=='true') pretty = JSON.parse(process.env.UCI_LOG_PRETTY) pretty = pretty || opts.pretty || {} pretty = Object.assign({},PRETTY_DEFAULTS,pretty) pretty.search = process.env.UCI_LOG_SEARCH pretty.include = pretty.include === 'all' ? 'all' : `level,${pretty.include}` console.log(pretty.include) pretty.ignore = pretty.include === 'all' ? null : Object.keys(logOpts).filter(key => pretty.include.indexOf(key) === -1 ).join() } } DATE_TIME = new Date().toString() 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)) } // makes recursively for any missing parent directories 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: enabled, safe: true, serializers: { req: pino.stdSerializers.req, res: pino.stdSerializers.res }, prettyPrint: pretty }, // if production not enabled then LOG_PATH is empty and logs go to stdout/stderr and can be piped from there LOG_PATH ) 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 function capitalize (s) { return s.charAt(0).toUpperCase() + s.slice(1)}