@luminati-io/luminati-proxy
Version:
A configurable local proxy for luminati.io
121 lines (107 loc) • 3.57 kB
JavaScript
// LICENSE_CODE ZON ISC
; /*jslint node:true, esnext:true*/
const cluster = require('cluster');
const winston = require('winston');
const Transport = require('winston-transport');
const date = require('../util/date.js');
const zerr = require('../util/zerr.js');
const lpm_config = require('../util/lpm_config.js');
const {printf, timestamp, combine, splat} = winston.format;
const DEFAULT_CONSOLE_LEVEL = 'notice';
try {
require('winston-daily-rotate-file');
} catch(e){
console.log('no winston-daily-rotate-file');
}
const syslog = require('winston-syslog');
const upper = winston.format(info=>{
info.level = info.level.toUpperCase();
return info;
});
const format = printf(opt=>{
const cat = opt.category ? opt.category+': ' : '';
const ts = date.to_sql_ms(opt.timestamp);
let pref = '';
if (cluster.isWorker)
pref = 'C'+cluster.worker.id+' ';
return `${pref}${ts} ${opt.level}: ${cat}${opt.message}`;
});
const get_console_transport = level=>
new winston.transports.Console({
level,
format: combine(timestamp(), upper(), splat(), format),
// transporting to stdout will cause workers to crash with EPERM, write
// err on windows server 2012r2, this redirects lvls to stderr instead
stderrLevels: lpm_config.is_win ? Object.keys(lpm_config.log_levels) :
[],
});
let current_level = DEFAULT_CONSOLE_LEVEL;
let console_transport = get_console_transport(current_level);
let file_transport;
try {
file_transport = new winston.transports.DailyRotateFile({
level: 'info',
format: combine(timestamp(), upper(), splat(), format),
dirname: lpm_config.work_dir,
filename: 'luminati-%DATE%.log',
maxSize: '50m',
maxFiles: 2,
zippedArchive: true,
});
file_transport.on('new', filename=>logger.lpm_filename = filename);
} catch(e){
console.log('Could not create file_transport', zerr.e2s(e));
}
winston.loggers.add('default', {
levels: lpm_config.log_levels,
transports: [
console_transport,
file_transport,
].filter(Boolean),
});
const logger = winston.loggers.get('default');
logger.set_level = level=>{
if (level==current_level)
return;
current_level = level;
logger.remove(console_transport);
console_transport = get_console_transport(current_level);
logger.add(console_transport);
};
const api_logger = logger.child({category: 'API'});
logger.get_api_mw = port=>(req, res, next)=>{
api_logger.debug('[%s] %s %s', port, req.method, req.originalUrl);
const start_time = Date.now();
res.on('finish', ()=>{
const elapsed_time = Date.now()-start_time;
api_logger.info('[%s] %fms %s %s %s %s', port, elapsed_time,
req.method, req.originalUrl, res.statusCode, res.statusMessage);
});
next();
};
module.exports = logger;
if (!winston.transports.Syslog)
winston.transports.Syslog = syslog.Syslog;
const syslog_transport = new winston.transports.Syslog({
level: 'info',
app_name: 'lpm',
localhost: null,
protocol: 'unix',
path: '/dev/log',
});
class Null_transport extends Transport {
get name(){
return 'null transport';
}
log(info, callback){
callback(null, true);
}
}
const null_transport = new Null_transport();
winston.loggers.add('reqs', {
levels: lpm_config.log_levels,
transports: [
!process.env.CLOUD_LOG && null_transport,
process.env.CLOUD_LOG && syslog_transport,
].filter(Boolean),
});