Для pinojs logger есть возможность подключиться к целевому потоку для отправки уведомлений - PullRequest
0 голосов
/ 21 апреля 2019

Этот вопрос относится к регистратору pinojs. https://github.com/pinojs/pino/issues/644

При производственной записи в пункт назначения pino (в моем случае это файл) есть ли способ перехватить функцию в этом потоке перед записью? Я хочу отправлять промежуточные уведомления всякий раз, когда в потоке записывается ошибка или фатальный журнал. Используйте pino-tee возможно https://github.com/pinojs/pino-tee? Некоторые предложения / советы приветствуются.

Здесь написана дочерняя функция logger, использующая pino. Я использую его в различных модулях кода для создания логгеров. Я хотел бы подключить функцию здесь на основе переданного параметра или переменной среды.

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


  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().toString()

    // create a destination path for production logging
    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 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)

  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)}
...