wangduanduan / wangduanduan.github.io

Wubba Lubba dub-dub
https://wdd.js.org
27 stars 7 forks source link

100行js代码,写日志到logstash #293

Closed wangduanduan closed 5 years ago

wangduanduan commented 5 years ago

源码

import net from 'net'
import debug from 'debug'

const appName = 'ivr-flow'

let myLog = {
  info: debug(`${appName}:info`),
  error: debug(`${appName}:error`),
  success: debug(`${appName}:success`)
}

interface State {
  connection: any
  connected: boolean
  currentReconnectTimes: number
}

interface tags {
  [index: string]: any
}

let config = {
  socketTimeout: 10 * 1000,
  port: 8080,
  host: '',
  reconnectTimeout: 2 * 1000,
  maxReconnectTimes: 3,
  commonTag: {}
}

let state: State = {
  connection: {},
  connected: false,
  currentReconnectTimes: 0
}

function realReconnect () {
  state.currentReconnectTimes++

  if (state.currentReconnectTimes > config.maxReconnectTimes) {
    myLog.error('currentReconnectTimes > maxReconnectTimes, no more reconnect')
    return
  }

  setTimeout(init, config.reconnectTimeout)
}

function writeMsg (msg: any) {
  try {
    msg = JSON.stringify(msg) + '\n'
    state.connection.write(msg)
  } catch (error) {
    myLog.error(error)
  }
}

export function send (msg: any) {
  if (state.connected) {
    msg = Object.assign(msg, config.commonTag)
    writeMsg(msg)
  } else {
    myLog.info('INFO: connection no established')
  }
}

export function init (params = {}) {
  config = Object.assign(config, params)

  state.connection = net.createConnection(config.port, config.host, () => {
    myLog.info('INFO: log stash connected')
    state.connected = true
    state.currentReconnectTimes = 0
  })

  state.connection.setTimeout(config.socketTimeout)

  state.connection.on('error', (err: any) => {
    myLog.error('ERROR: onError: ', err)
    state.connected = false
    state.connection.destroy()
    realReconnect()
  })

  state.connection.on('close', (hadError: any) => {
    myLog.info('INFO: onClose, hadError: ', hadError)
    state.connected = false
    hadError && realReconnect()
  })
}

function createPayload (msg: string, level: string, tags: any) {
  tags = tags || {}
  tags.level = level
  tags.message = msg
  return tags
}

export function info (msg: string ,tags: tags) {
  let payload = createPayload(msg, 'info', tags)
  myLog.info(tags.from, msg)
  send(payload)
}

export function error (msg: string, tags: tags) {
  let payload = createPayload(msg, 'error', tags)
  myLog.error(tags.from, msg)
  send(payload)
}

export function success (msg: string, tags: tags) {
  let payload = createPayload(msg, 'success', tags)
  myLog.success(tags.from, msg)
  send(payload)
}

例子

import * as log from './logstash'
log.init({
  host: env.logHost,
  port: env.logPort,
  commonTag: {
    hostname: process.env.HOSTNAME || 'dev',
    appName: 'ivr-flow'
  }
})

log.log('test', {
func: 'main'
from: 'test.ts'
})