Closed wangduanduan closed 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' })
源码
例子